home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / yahtze1a / clshtmlh.cls < prev    next >
Text File  |  1999-09-26  |  83KB  |  2,924 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "HTMLHelp"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. ' ********************************************************
  15. ' HTML Help class module version 3.0d
  16. ' (c)September 1999, Delmar Computing Services
  17. '
  18. ' For use with Microsoft Visual Basic(r)
  19. ' versions 4 (32-bit), 5 and 6
  20. '
  21. ' Developed by David Liske, Tipton, Michigan, USA
  22. ' Microsoft HTML Help MVP 1999
  23. ' http://www.vbexplorer.com/htmlhelp.asp
  24. '
  25. ' Please send any performance or functionality
  26. ' modifications of this file to delmar@tc3net.com
  27. ' ________________________________________________________
  28. '
  29. ' Proof-of-concept testing and some HTML Help
  30. ' API research provided by Robert Chandler,
  31. ' The HelpWare Group, and Varian Corporation,
  32. ' Melbourne, Vic, Australia
  33. ' Microsoft HTML Help MVP 1999
  34. ' http://www.helpware.net
  35. '
  36. ' Some registry functionality re-developed from
  37. ' original code written by Dave Scarmozzino
  38. ' http://www.TheScarms.com
  39. '
  40. ' Beta testing (July 1999):
  41. ' Lani Hardage, MDL Information Systems, Inc.
  42. ' Steve Hsu, TREEV, Inc.
  43. ' John Hunt, Lotus Development Corporation
  44. ' Shirley Kelly, Corbel, A SunGard Company
  45. ' Valerie A. Lipow, Compuware Corporation
  46. ' Leyden Martinez, Copextel, S.A., Cuba
  47. ' Alejandro Sicilia, Copextel, S.A., Cuba
  48. '
  49. ' Further testing by Dana Cline,
  50. ' Lucent Technologies, Boulder, Colorado
  51. ' Microsoft HTML Help MVP 1998, 1999
  52. '
  53. ' Modifications of HTML Help version-checking and
  54. ' IE version-checking code, and Windows NT/2000
  55. ' problem-solving,
  56. ' by Leonardo Presciuttini, Italy (August 1999)
  57. '
  58. ' GetLongPath_Legacy logic checks and code modifications,
  59. ' and all-around support of a programming geek's
  60. ' chocolate and strange snacking needs, by:
  61. ' Marnella Liske, RN, BSN
  62. ' University of Michigan Medical Center
  63. '
  64. ' ********************************************************
  65.  
  66. Option Explicit
  67. Option Compare Text
  68.  
  69. ' Public declarations
  70. Public frm As Object
  71. Public hwnd As Long
  72. Public lpPrevWndFunc As Long
  73.  
  74. Public Enum PopupType
  75.   HH_CHM_POPUP = &H1
  76.   HH_RESOURCE_POPUP = &H2
  77.   HH_TEXT_POPUP = &H4
  78. End Enum
  79.  
  80. Public Enum HHVersion
  81.   HH_1_0 = &H10
  82.   HH_1_1 = &H11
  83.   HH_1_1A = &H12
  84.   HH_1_1B = &H13
  85.   HH_1_2 = &H14
  86.   HH_1_21 = &H15
  87.   HH_1_21A = &H16
  88.   HH_1_22 = &H17
  89.   HH_1_3 = &H18
  90. End Enum
  91.  
  92. Public Enum IEVersion
  93.   IE_3_0 = &H100
  94.   IE_3_0_OSR2 = &H101
  95.   IE_3_01 = &H102
  96.   IE_3_02 = &H103
  97.   IE_4_0_PP2 = &H104
  98.   IE_4_0 = &H105
  99.   IE_4_01 = &H106
  100.   IE_4_01_SP1 = &H107
  101.   IE_4_01_SP2 = &H108
  102.   IE_5_0_Beta1 = &H109
  103.   IE_5_0_Beta2 = &H10A
  104.   IE_5_0 = &H10B
  105.   IE_5_0A = &H10C
  106.   IE_5_0B = &H10D
  107.   IE_5_0C = &H10E
  108. End Enum
  109.  
  110. ' HTML Help Version Constants
  111. Private Const extHH_1_0 = "4.72.7290"
  112. Private Const extHH_1_1 = "4.72.7323"
  113. Private Const extHH_1_1A = "4.72.7325"
  114. Private Const extHH_1_1B = "4.72.8164.0"
  115. Private Const extHH_1_2 = "4.73.8252"
  116. Private Const extHH_1_21 = "4.73.8412"
  117. Private Const extHH_1_21A = "4.73.8474"
  118. Private Const extHH_1_22 = "4.73.8561"
  119. Private Const extHH_1_3 = "4.74.8566"
  120.  
  121. ' Internet Explorer Version Constants
  122. Private Const extIE_3_0 = "4.70.1155"
  123. Private Const extIE_3_0_OSR2 = "4.70.1158"
  124. Private Const extIE_3_01 = "4.70.1215"
  125. Private Const extIE_3_02 = "4.70.1300"
  126. Private Const extIE_4_0_PP2 = "4.71.1008.3"
  127. Private Const extIE_4_0 = "4.71.1712.5"
  128. Private Const extIE_4_01 = "4.72.2106.7"
  129. Private Const extIE_4_01_SP1 = "4.72.3110.03"
  130. Private Const extIE_4_01_SP2 = "4.72.3612.1707"
  131. Private Const extIE_5_0_Beta1 = "5.00.0518.5"
  132. Private Const extIE_5_0_Beta2 = "5.00.0910.1308"
  133. Private Const extIE_5_0 = "5.00.2014.213"
  134. Private Const extIE_5_0A = "5.00.2314.1000"
  135. Private Const extIE_5_0B = "5.00.2614.3500"
  136. Private Const extIE_5_0C = "5.0.2717.2000"
  137.  
  138. Private Const extUNKNOWN = "unknown"
  139.  
  140. ' HTML Help Constants
  141. Private Const HH_DISPLAY_TOPIC = &H0            '  WinHelp equivalent
  142. Private Const HH_DISPLAY_TOC = &H1              '  WinHelp equivalent
  143. Private Const HH_DISPLAY_INDEX = &H2            '  WinHelp equivalent
  144. Private Const HH_DISPLAY_SEARCH = &H3           '  WinHelp equivalent
  145. Private Const HH_SET_WIN_TYPE = &H4
  146. Private Const HH_GET_WIN_TYPE = &H5
  147. Private Const HH_GET_WIN_HANDLE = &H6
  148. Private Const HH_SYNC = &H9
  149. Private Const HH_ADD_NAV_UI = &HA               ' not currently implemented
  150. Private Const HH_ADD_BUTTON = &HB               ' not currently implemented
  151. Private Const HH_GETBROWSER_APP = &HC           ' not currently implemented
  152. Private Const HH_KEYWORD_LOOKUP = &HD           '  WinHelp equivalent
  153. Private Const HH_DISPLAY_TEXT_POPUP = &HE       ' display string resource id
  154.                                                 ' or text in a popup window
  155.                                                 ' value in dwData
  156. Private Const HH_HELP_CONTEXT = &HF             '  display mapped numeric
  157. Private Const HH_CLOSE_ALL = &H12               '  WinHelp equivalent
  158. Private Const HH_ALINK_LOOKUP = &H13            '  ALink version of
  159.                                                 '  HH_KEYWORD_LOOKUP
  160. Private Const HH_SET_GUID = &H1A                ' For Microsoft Installer -- dwData is a pointer to the GUID string
  161.  
  162. ' HTML Help window constants. These are also used
  163. ' in the window definitions in HHP files
  164. Private Const HHWIN_PROP_ONTOP = &H2              ' Top-most window (not currently implemented)
  165. Private Const HHWIN_PROP_NOTITLEBAR = &H4         ' no title bar
  166. Private Const HHWIN_PROP_NODEF_STYLES = &H8       ' no default window styles (only HH_WINTYPE.dwStyles)
  167. Private Const HHWIN_PROP_NODEF_EXSTYLES = &H10    ' no default extended window styles (only HH_WINTYPE.dwExStyles)
  168. Private Const HHWIN_PROP_TRI_PANE = &H20          ' use a tri-pane window
  169. Private Const HHWIN_PROP_NOTB_TEXT = &H40         ' no text on toolbar buttons
  170. Private Const HHWIN_PROP_POST_QUIT = &H80         ' post WM_QUIT message when window closes
  171. Private Const HHWIN_PROP_AUTO_SYNC = &H100        ' automatically ssync contents and index
  172. Private Const HHWIN_PROP_TRACKING = &H200         ' send tracking notification messages
  173. Private Const HHWIN_PROP_TAB_SEARCH = &H400       ' include search tab in navigation pane
  174. Private Const HHWIN_PROP_TAB_HISTORY = &H800      ' include history tab in navigation pane
  175. Private Const HHWIN_PROP_TAB_BOOKMARKS = &H1000   ' include bookmark tab in navigation pane
  176. Private Const HHWIN_PROP_CHANGE_TITLE = &H2000    ' Put current HTML title in title bar
  177. Private Const HHWIN_PROP_NAV_ONLY_WIN = &H4000    ' Only display the navigation window
  178. Private Const HHWIN_PROP_NO_TOOLBAR = &H8000      ' Don't display a toolbar
  179. Private Const HHWIN_PROP_MENU = &H10000           ' Menu
  180. Private Const HHWIN_PROP_TAB_ADVSEARCH = &H20000  ' Advanced FTS UI.
  181. Private Const HHWIN_PROP_USER_POS = &H40000       ' After initial creation, user controls window size/position
  182.  
  183. Private Const HHWIN_PARAM_PROPERTIES = &H2        ' valid fsWinProperties
  184. Private Const HHWIN_PARAM_STYLES = &H4            ' valid dwStyles
  185. Private Const HHWIN_PARAM_EXSTYLES = &H8          ' valid dwExStyles
  186. Private Const HHWIN_PARAM_RECT = &H10             ' valid rcWindowPos
  187. Private Const HHWIN_PARAM_NAV_WIDTH = &H20        ' valid iNavWidth
  188. Private Const HHWIN_PARAM_SHOWSTATE = &H40        ' valid nShowState
  189. Private Const HHWIN_PARAM_INFOTYPES = &H80        ' valid apInfoTypes
  190. Private Const HHWIN_PARAM_TB_FLAGS = &H100        ' valid fsToolBarFlags
  191. Private Const HHWIN_PARAM_EXPANSION = &H200       ' valid fNotExpanded
  192. Private Const HHWIN_PARAM_TABPOS = &H400          ' valid tabpos
  193. Private Const HHWIN_PARAM_TABORDER = &H800        ' valid taborder
  194. Private Const HHWIN_PARAM_HISTORY_COUNT = &H1000  ' valid cHistory
  195. Private Const HHWIN_PARAM_CUR_TAB = &H2000        ' valid curNavType
  196.  
  197. Private Const HHWIN_BUTTON_EXPAND = &H2           ' Expand/contract button
  198. Private Const HHWIN_BUTTON_BACK = &H4             ' Back button
  199. Private Const HHWIN_BUTTON_FORWARD = &H8          ' Forward button
  200. Private Const HHWIN_BUTTON_STOP = &H10            ' Stop button
  201. Private Const HHWIN_BUTTON_REFRESH = &H20         ' Refresh button
  202. Private Const HHWIN_BUTTON_HOME = &H40            ' Home button
  203. Private Const HHWIN_BUTTON_BROWSE_FWD = &H80      ' not implemented
  204. Private Const HHWIN_BUTTON_BROWSE_BCK = &H100     ' not implemented
  205. Private Const HHWIN_BUTTON_NOTES = &H200          ' not implemented
  206. Private Const HHWIN_BUTTON_CONTENTS = &H400       ' not implemented
  207. Private Const HHWIN_BUTTON_SYNC = &H800           ' Locate button
  208. Private Const HHWIN_BUTTON_OPTIONS = &H1000       ' Options button
  209. Private Const HHWIN_BUTTON_PRINT = &H2000         ' Print button
  210. Private Const HHWIN_BUTTON_INDEX = &H4000         ' not implemented
  211. Private Const HHWIN_BUTTON_SEARCH = &H8000        ' not implemented
  212. Private Const HHWIN_BUTTON_HISTORY = &H10000      ' not implemented
  213. Private Const HHWIN_BUTTON_BOOKMARKS = &H20000    ' not implemented
  214. Private Const HHWIN_BUTTON_JUMP1 = &H40000        ' Jump1 button
  215. Private Const HHWIN_BUTTON_JUMP2 = &H80000        ' Jump2 button
  216. Private Const HHWIN_BUTTON_ZOOM = &H100000        ' Font sizing button
  217. Private Const HHWIN_BUTTON_TOC_NEXT = &H200000    ' Browse next TOC topic button
  218. Private Const HHWIN_BUTTON_TOC_PREV = &H400000    ' Browse previous TOC topic button
  219.  
  220. ' Default button set
  221. Private Const HHWIN_DEF_BUTTONS = _
  222.             (HHWIN_BUTTON_EXPAND Or _
  223.              HHWIN_BUTTON_BACK Or _
  224.              HHWIN_BUTTON_OPTIONS Or _
  225.              HHWIN_BUTTON_PRINT)
  226.  
  227. ' Button IDs
  228. Private Const IDTB_EXPAND = 200
  229. Private Const IDTB_CONTRACT = 201
  230. Private Const IDTB_STOP = 202
  231. Private Const IDTB_REFRESH = 203
  232. Private Const IDTB_BACK = 204
  233. Private Const IDTB_HOME = 205
  234. Private Const IDTB_SYNC = 206
  235. Private Const IDTB_PRINT = 207
  236. Private Const IDTB_OPTIONS = 208
  237. Private Const IDTB_FORWARD = 209
  238. Private Const IDTB_NOTES = 210             ' not implemented
  239. Private Const IDTB_BROWSE_FWD = 211
  240. Private Const IDTB_BROWSE_BACK = 212
  241. Private Const IDTB_CONTENTS = 213          ' not implemented
  242. Private Const IDTB_INDEX = 214             ' not implemented
  243. Private Const IDTB_SEARCH = 215            ' not implemented
  244. Private Const IDTB_HISTORY = 216           ' not implemented
  245. Private Const IDTB_BOOKMARKS = 217         ' not implemented
  246. Private Const IDTB_JUMP1 = 218
  247. Private Const IDTB_JUMP2 = 219
  248. Private Const IDTB_CUSTOMIZE = 221
  249. Private Const IDTB_ZOOM = 222
  250. Private Const IDTB_TOC_NEXT = 223
  251. Private Const IDTB_TOC_PREV = 224
  252.  
  253. Private Enum HHACT_
  254.   HHACT_TAB_CONTENTS
  255.   HHACT_TAB_INDEX
  256.   HHACT_TAB_SEARCH
  257.   HHACT_TAB_HISTORY
  258.   HHACT_TAB_FAVORITES
  259.     
  260.   HHACT_EXPAND
  261.   HHACT_CONTRACT
  262.   HHACT_BACK
  263.   HHACT_FORWARD
  264.   HHACT_STOP
  265.   HHACT_REFRESH
  266.   HHACT_HOME
  267.   HHACT_SYNC
  268.   HHACT_OPTIONS
  269.   HHACT_PRINT
  270.   HHACT_HIGHLIGHT
  271.   HHACT_CUSTOMIZE
  272.   HHACT_JUMP1
  273.   HHACT_JUMP2
  274.   HHACT_ZOOM
  275.   HHACT_TOC_NEXT
  276.   HHACT_TOC_PREV
  277.   HHACT_NOTES
  278.  
  279.   HHACT_LAST_ENUM
  280. End Enum
  281.  
  282. Private Enum HHWIN_NAVTYPE_
  283.   HHWIN_NAVTYPE_TOC
  284.   HHWIN_NAVTYPE_INDEX
  285.   HHWIN_NAVTYPE_SEARCH
  286.   HHWIN_NAVTYPE_HISTORY       ' not implemented
  287.   HHWIN_NAVTYPE_FAVORITES     ' not implemented
  288. End Enum
  289.  
  290. Enum HHWIN_NAVTAB_
  291.   HHWIN_NAVTAB_TOP
  292.   HHWIN_NAVTAB_LEFT
  293.   HHWIN_NAVTAB_BOTTOM
  294. End Enum
  295.  
  296. Private Const HH_MAX_TABS = 19               ' maximum number of tabs
  297.  
  298. Private Enum HH_TAB_
  299.   HH_TAB_CONTENTS
  300.   HH_TAB_INDEX
  301.   HH_TAB_SEARCH
  302.   HH_TAB_HISTORY
  303.   HH_TAB_FAVORITES
  304. End Enum
  305.  
  306. Private Type RECT
  307.   Left As Long
  308.   Top As Long
  309.   Right As Long
  310.   Bottom As Long
  311. End Type
  312.  
  313. Private Type tagHH_WINTYPE
  314.   cbStruct As Long            ' IN: size of this structure including all Information Types
  315.   fUniCodeStrings As Long     ' IN/OUT: TRUE if all strings are in UNICODE
  316.   pszType  As String          ' IN/OUT: Name of a type of window
  317.   fsValidMembers As Long      ' IN: Bit flag of valid members (HHWIN_PARAM_)
  318.   fsWinProperties As Long     ' IN/OUT: Properties/attributes of the window (HHWIN_)
  319.   pszCaption As String        ' IN/OUT: Window title
  320.   dwStyles  As Long           ' IN/OUT: Window styles
  321.   dwExStyles As Long          ' IN/OUT: Extended Window styles
  322.   rcWindowPos As RECT         ' IN: Starting position, OUT: current position
  323.   nShowState As Long          ' IN: show state (e.g., SW_SHOW)
  324.   hwndHelp As Long            ' OUT: window handle
  325.   hwndCaller As Long          ' OUT: who called this window
  326.   paInfoTypes As Long         ' IN: Pointer to an array of Information Types
  327.  
  328.   ' The following members are only valid if HHWIN_PROP_TRI_PANE is set
  329.  
  330.   hwndToolBar As Long         ' OUT: toolbar window in tri-pane window
  331.   hwndNavigation As Long      ' OUT: navigation window in tri-pane window
  332.   hwndHTML As Long            ' OUT: window displaying HTML in tri-pane window
  333.   iNavWidth As Long           ' IN/OUT: width of navigation window
  334.   rcHTML As RECT              ' OUT: HTML window coordinates
  335.  
  336.   pszToc As String            ' IN: Location of the table of contents file
  337.   pszIndex As String          ' IN: Location of the index file
  338.   pszFile As String           ' IN: Default location of the html file
  339.   pszHome As String           ' IN/OUT: html file to display when Home button is clicked
  340.   fsToolBarFlags As Long      ' IN: flags controling the appearance of the toolbar
  341.   fNotExpanded As Long        ' IN: TRUE/FALSE to contract or expand, OUT: current state
  342.   curNavType As Long          ' IN/OUT: UI to display in the navigational pane
  343.   tabpos As HHWIN_NAVTAB_     ' IN/OUT: HHWIN_NAVTAB_TOP, HHWIN_NAVTAB_LEFT, or HHWIN_NAVTAB_BOTTOM
  344.   idNotify As Long            ' IN: ID to use for WM_NOTIFY messages
  345.   tabOrder(HH_MAX_TABS) As Byte ' IN/OUT: tab order: Contents, Index, Search, History, Favorites, Reserved 1-5, Custom tabs
  346.   cHistory As Long            ' IN/OUT: number of history items to keep (default is 30)
  347.   pszJump1 As String          ' Text for HHWIN_BUTTON_JUMP1
  348.   pszJump2 As String          ' Text for HHWIN_BUTTON_JUMP2
  349.   pszUrlJump1 As String       ' URL for HHWIN_BUTTON_JUMP1
  350.   pszUrlJump2 As String       ' URL for HHWIN_BUTTON_JUMP2
  351.   rcMinSize As RECT           ' Minimum size for window (ignored in version 1)
  352.   cbInfoTypes As Long         ' size of paInfoTypes;
  353. End Type
  354.  
  355. ' UDT for mouse cursor position
  356. Private Type POINTAPI
  357.   x As Long
  358.   y As Long
  359. End Type
  360.  
  361. ' UDT for text popups
  362. Private Type tagHH_POPUP
  363.   cbStruct As Integer                         ' sizeof this structure
  364.   hinst As Long                               ' instance handle for string resource
  365.   idString As Long                            ' string resource id, or text id if pszFile
  366.                                               ' is specified in HtmlHelp call
  367.   pszText As String                           ' used if idString is zero
  368.   pt As POINTAPI                              ' top center of popup window
  369.   clrForeground As ColorConstants             ' either use VB constant or &HBBGGRR
  370.   clrBackground As ColorConstants             ' either use VB constant or &HBBGGRR
  371.   rcMargins As RECT                           ' amount of space between edges of window and
  372.                                               ' text, -1 for each member to ignore
  373.   pszFont As String                           ' facename, point size, char set, BOLD ITALIC
  374.                                               ' UNDERLINE
  375. End Type
  376.  
  377. ' UDT for keyword and ALink searches
  378. Private Type tagHH_AKLINK
  379.   cbStruct          As Long
  380.   fReserved         As Boolean
  381.   pszKeywords       As String
  382.   pszUrl            As String
  383.   pszMsgText        As String
  384.   pszMsgTitle       As String
  385.   pszWindow         As String
  386.   fIndexOnFail      As Boolean
  387. End Type
  388.  
  389. ' UDT for accessing the Search tab
  390. Private Type tagHH_FTS_QUERY
  391.   cbStruct          As Long
  392.   fUniCodeStrings   As Long
  393.   pszSearchQuery    As String
  394.   iProximity        As Long
  395.   fStemmedSearch    As Long
  396.   fTitleOnly        As Long
  397.   fExecute          As Long
  398.   pszWindow         As String
  399. End Type
  400.  
  401. ' Constants for converting the cursor to What's This Help
  402. Private Const WM_SYSCOMMAND = &H112
  403. Private Const SC_CONTEXTHELP = &HF180&
  404.                                                
  405. ' Message Box Constants
  406. Private Const MB_ABORTRETRYIGNORE = &H2&
  407. Private Const MB_APPLMODAL = &H0&
  408. Private Const MB_COMPOSITE = &H2
  409. Private Const MB_DEFAULT_DESKTOP_ONLY = &H20000
  410. Private Const MB_DEFBUTTON1 = &H0&
  411. Private Const MB_DEFBUTTON2 = &H100&
  412. Private Const MB_DEFBUTTON3 = &H200&
  413. Private Const MB_DEFMASK = &HF00&
  414. Private Const MB_ICONASTERISK = &H40&
  415. Private Const MB_ICONEXCLAMATION = &H30&
  416. Private Const MB_ICONHAND = &H10&
  417. Private Const MB_ICONINFORMATION = MB_ICONASTERISK
  418. Private Const MB_ICONMASK = &HF0&
  419. Private Const MB_ICONQUESTION = &H20&
  420. Private Const MB_ICONSTOP = MB_ICONHAND
  421. Private Const MB_MISCMASK = &HC000&
  422. Private Const MB_MODEMASK = &H3000&
  423. Private Const MB_NOFOCUS = &H8000&
  424. Private Const MB_OK = &H0&
  425. Private Const MB_OKCANCEL = &H1&
  426. Private Const MB_PRECOMPOSED = &H1
  427. Private Const MB_RETRYCANCEL = &H5&
  428. Private Const MB_SETFOREGROUND = &H10000
  429. Private Const MB_SYSTEMMODAL = &H1000&
  430. Private Const MB_TASKMODAL = &H2000&
  431. Private Const MB_TYPEMASK = &HF&
  432. Private Const MB_USEGLYPHCHARS = &H4
  433. Private Const MB_YESNO = &H4&
  434. Private Const MB_YESNOCANCEL = &H3&
  435.  
  436. ' Registry API call Constants
  437. Private Const HKEY_LOCAL_MACHINE = &H80000002
  438. Private Const ERROR_SUCCESS = 0&
  439. Private Const STANDARD_RIGHTS_ALL = &H1F0000
  440. Private Const KEY_QUERY_VALUE = &H1
  441. Private Const KEY_SET_VALUE = &H2
  442. Private Const KEY_CREATE_SUB_KEY = &H4
  443. Private Const KEY_ENUMERATE_SUB_KEYS = &H8
  444. Private Const KEY_NOTIFY = &H10
  445. Private Const KEY_CREATE_LINK = &H20
  446. Private Const SYNCHRONIZE = &H100000
  447. Private Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
  448.  
  449. Private Const MAX_PATH = 260
  450. Private Const INVALID_HANDLE_VALUE = -1
  451.  
  452. ' RegCreateKeyEx options
  453. Private Const REG_OPTION_NON_VOLATILE = 0
  454.  
  455. ' Registry data types
  456. Private Const REG_NONE = 0
  457. Private Const REG_SZ = 1
  458. Private Const REG_EXPAND_SZ = 2
  459. Private Const REG_BINARY = 3
  460. Private Const REG_DWORD = 4
  461.  
  462. ' FindFirstFile return values
  463. Private Const ERROR_FILE_NOT_FOUND = 2&
  464. Private Const ERROR_MORE_DATA = 234
  465. Private Const ERROR_NO_MORE_ITEMS = 259&
  466.  
  467. ' Constants for Registry top-level keys
  468. Private Const HKEY_CURRENT_USER = &H80000001
  469. Private Const HKEY_USERS = &H80000003
  470. Private Const HKEY_DYN_DATA = &H80000006
  471. Private Const HKEY_CURRENT_CONFIG = &H80000005
  472. Private Const HKEY_CLASSES_ROOT = &H80000000
  473.  
  474. Private Const MAX_SIZE = 2048
  475. Private Const MAX_INISIZE = 8192
  476.  
  477. Private Const GWL_STYLE = (-16)
  478. Private Const GWL_EXSTYLE = (-20)
  479. Private Const GWL_WNDPROC = (-4)
  480.  
  481. ' Constants for GetLongPath_Legacy
  482. Private Const SINGLE_QUOTE = """"
  483.  
  484. ' Constants for determining OS
  485. Private Const VER_PLATFORM_WIN32s = 0
  486. Private Const VER_PLATFORM_WIN32_WINDOWS = 1
  487. Private Const VER_PLATFORM_WIN32_NT = 2
  488.  
  489. Private Const UNKNOWN_OS = 0
  490. Private Const WINDOWS_NT_3_51 = 1
  491. Private Const WINDOWS_95 = 2
  492. Private Const WINDOWS_NT_4 = 3
  493. Private Const WINDOWS_98 = 4
  494. Private Const WINDOWS_2000 = 5
  495.  
  496. ' UDT for determining OS
  497. Private Type OSVERSIONINFO
  498.   dwOSVersionInfoSize As Long
  499.   dwMajorVersion As Long
  500.   dwMinorVersion As Long
  501.   dwBuildNumber As Long
  502.   dwPlatformId As Long
  503.   szCSDVersion As String * 128
  504. End Type
  505.  
  506. ' UDT for message box API calls
  507. Private Type MSGBOXPARAMS
  508.   cbSize As Long
  509.   hWndOwner As Long
  510.   hInstance As Long
  511.   lpszText As String
  512.   lpszCaption As String
  513.   dwStyle As Long
  514.   lpszIcon As String
  515.   dwContextHelpId As Long
  516.   lpfnMsgBoxCallback As Long
  517.   dwLanguageId As Long
  518. End Type
  519.  
  520. ' Registry UDT's
  521. Private Type SECURITY_ATTRIBUTES
  522.   nLength As Long
  523.   lpSecurityDescriptor As Long
  524.   bInheritHandle As Long
  525. End Type
  526.  
  527. Private Type HH_REG_VALUES
  528.   pszFileName     As String
  529.   pszFilePath     As String
  530. End Type
  531.  
  532. Private Type FILETIME
  533.   dwLowDateTime As Long
  534.   dwHighDateTime As Long
  535. End Type
  536.  
  537. Private Type WIN32_FIND_DATA
  538.   dwFileAttributes As Long
  539.   ftCreationTime As FILETIME
  540.   ftLastAccessTime As FILETIME
  541.   ftLastWriteTime As FILETIME
  542.   nFileSizeHigh As Long
  543.   nFileSizeLow As Long
  544.   dwReserved0 As Long
  545.   dwReserved1 As Long
  546.   cFileName As String * MAX_PATH
  547.   cAlternate As String * 14
  548. End Type
  549.  
  550. Private Type VS_FIXEDFILEINFO
  551.   dwSignature As Long
  552.   dwStrucVersionl As Integer     '  e.g. = &h0000 = 0
  553.   dwStrucVersionh As Integer     '  e.g. = &h0042 = .42
  554.   dwFileVersionMSl As Integer    '  e.g. = &h0003 = 3
  555.   dwFileVersionMSh As Integer    '  e.g. = &h0075 = .75
  556.   dwFileVersionLSl As Integer    '  e.g. = &h0000 = 0
  557.   dwFileVersionLSh As Integer    '  e.g. = &h0031 = .31
  558.   dwProductVersionMSl As Integer '  e.g. = &h0003 = 3
  559.   dwProductVersionMSh As Integer '  e.g. = &h0010 = .1
  560.   dwProductVersionLSl As Integer '  e.g. = &h0000 = 0
  561.   dwProductVersionLSh As Integer '  e.g. = &h0031 = .31
  562.   dwFileFlagsMask As Long        '  = &h3F for version "0.42"
  563.   dwFileFlags As Long            '  e.g. VFF_DEBUG Or VFF_PRERELEASE
  564.   dwFileOS As Long               '  e.g. VOS_DOS_WINDOWS16
  565.   dwFileType As Long             '  e.g. VFT_DRIVER
  566.   dwFileSubtype As Long          '  e.g. VFT2_DRV_KEYBOARD
  567.   dwFileDateMS As Long           '  e.g. 0
  568.   dwFileDateLS As Long           '  e.g. 0
  569. End Type
  570.  
  571. ' HTML Help API declarations
  572. Private Declare Function HTMLHelp Lib "hhctrl.ocx" _
  573.     Alias "HtmlHelpA" (ByVal hwnd As Long, _
  574.     ByVal lpHelpFile As String, _
  575.     ByVal wCommand As Long, _
  576.     ByVal dwData As Long) As Long
  577.     
  578. Private Declare Function HTMLHelpCallSearch Lib "hhctrl.ocx" _
  579.     Alias "HtmlHelpA" (ByVal hwnd As Long, _
  580.     ByVal lpHelpFile As String, _
  581.     ByVal wCommand As Long, _
  582.     ByRef dwData As tagHH_FTS_QUERY) As Long
  583.     
  584. Private Declare Function HTMLHelpKeyWord Lib "hhctrl.ocx" _
  585.     Alias "HtmlHelpA" (ByVal hwnd As Long, _
  586.     ByVal lpHelpFile As String, _
  587.     ByVal wCommand As Long, _
  588.     dwData As tagHH_AKLINK) As Long
  589.     
  590. Private Declare Function htmlHelpTextPopup Lib "hhctrl.ocx" _
  591.     Alias "HtmlHelpA" (ByVal hwnd As Long, _
  592.     ByVal lpHelpFile As String, _
  593.     ByVal wCommand As Long, _
  594.     ByRef dwData As tagHH_POPUP) As Long
  595.     
  596. Private Declare Function htmlHelpTopic Lib "hhctrl.ocx" _
  597.     Alias "HtmlHelpA" (ByVal hwnd As Long, _
  598.     ByVal lpHelpFile As String, _
  599.     ByVal wCommand As Long, _
  600.     ByVal dwData As String) As Long
  601.     
  602. ' Subclassing API declarations
  603. Private Declare Function DefWindowProc Lib "user32" _
  604.     Alias "DefWindowProcA" (ByVal hwnd As Long, _
  605.     ByVal wMsg As Long, _
  606.     ByVal wParam As Long, _
  607.     ByVal lParam As Long) As Long
  608.  
  609. ' Registry API declarations
  610. Private Declare Function RegCreateKeyEx Lib "advapi32.dll" _
  611.     Alias "RegCreateKeyExA" (ByVal hKey As Long, _
  612.     ByVal lpSubKey As String, _
  613.     ByVal Reserved As Long, _
  614.     ByVal lpClass As String, _
  615.     ByVal dwOptions As Long, _
  616.     ByVal samDesired As Long, _
  617.     lpSecurityAttributes As SECURITY_ATTRIBUTES, _
  618.     phkResult As Long, _
  619.     lpdwDisposition As Long) As Long
  620.     
  621. Private Declare Function ExpandEnvironmentStrings _
  622.     Lib "kernel32" Alias "ExpandEnvironmentStringsA" _
  623.     (ByVal lpSrc As String, _
  624.     ByVal lpDst As String, _
  625.     ByVal nSize As Long) As Long
  626.         
  627. Private Declare Function RegCloseKey Lib "advapi32.dll" _
  628.     (ByVal hKey As Long) As Long
  629.         
  630. Private Declare Function RegDeleteValue Lib "advapi32.dll" _
  631.     Alias "RegDeleteValueA" _
  632.     (ByVal hKey As Long, _
  633.     ByVal lpValueName As String) As Long
  634.  
  635. Private Declare Function RegEnumKey Lib "advapi32.dll" _
  636.     Alias "RegEnumKeyA" _
  637.     (ByVal hKey As Long, _
  638.     ByVal dwIndex As Long, _
  639.     ByVal lpName As String, _
  640.     ByVal cbName As Long) As Long
  641.  
  642. Private Declare Function RegEnumValue Lib "advapi32.dll" _
  643.     Alias "RegEnumValueA" _
  644.     (ByVal hKey As Long, _
  645.     ByVal dwIndex As Long, _
  646.     ByVal lpValueName As String, _
  647.     lpcbValueName As Long, _
  648.     ByVal lpReserved As Long, _
  649.     lpType As Long, _
  650.     lpData As Any, _
  651.     lpcbData As Long) As Long
  652.     
  653. Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
  654.     Alias "RegOpenKeyExA" (ByVal hKey As Long, _
  655.     ByVal lpSubKey As String, _
  656.     ByVal ulOptions As Long, _
  657.     ByVal samDesired As Long, _
  658.     phkResult As Long) As Long
  659.  
  660. Private Declare Function RegQueryValue Lib "advapi32.dll" _
  661.     Alias "RegQueryValueA" _
  662.     (ByVal hKey As Long, _
  663.     ByVal lpSubKey As String, _
  664.     ByVal lpValue As String, _
  665.     lpcbValue As Long) As Long
  666.  
  667. Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
  668.     Alias "RegQueryValueExA" (ByVal hKey As Long, _
  669.     ByVal lpValueName As String, _
  670.     ByVal lpReserved As Long, _
  671.     lpType As Long, lpData As Any, _
  672.     lpcbData As Long) As Long
  673.  
  674. Private Declare Function RegSetValueEx Lib "advapi32.dll" _
  675.     Alias "RegSetValueExA" _
  676.     (ByVal hKey As Long, _
  677.     ByVal lpValueName As String, _
  678.     ByVal Reserved As Long, _
  679.     ByVal dwType As Long, _
  680.     lpData As Any, _
  681.     ByVal cbData As Long) As Long
  682.  
  683. ' Calls to find actual file
  684. Private Declare Function FindClose Lib "kernel32" _
  685.     (ByVal hFindFile As Long) As Long
  686.     
  687. Private Declare Function FindFirstFile Lib "kernel32" _
  688.     Alias "FindFirstFileA" (ByVal lpFileName As String, _
  689.     lpFindFileData As WIN32_FIND_DATA) As Long
  690.  
  691. ' Declarations to retrieve version information
  692. Private Declare Function GetFileVersionInfo& _
  693.     Lib "version.dll" Alias "GetFileVersionInfoA" _
  694.     (ByVal lptstrFilename As String, _
  695.     ByVal dwHandle As Long, _
  696.     ByVal dwLen As Long, _
  697.     lpData As Byte)
  698.         
  699. Private Declare Function GetFileVersionInfoSize& _
  700.     Lib "version.dll" Alias "GetFileVersionInfoSizeA" _
  701.     (ByVal lptstrFilename As String, _
  702.     lpdwHandle As Long)
  703.  
  704. Private Declare Function VerQueryValue& Lib "version.dll" _
  705.     Alias "VerQueryValueA" _
  706.     (pBlock As Byte, _
  707.     ByVal lpSubBlock As String, _
  708.     lpBuffer As Long, _
  709.     puLen As Long)
  710.  
  711. ' Declaration to copy memory contents from one area to another
  712. Private Declare Sub CopyMem Lib "kernel32" _
  713.     Alias "RtlMoveMemory" _
  714.     (Destination As Any, _
  715.     Source As Any, _
  716.     ByVal Length As Long)
  717.  
  718. ' Call to get the current mouse position
  719. Private Declare Function GetCursorPos& Lib "user32" _
  720.     (lpPoint As POINTAPI)
  721.  
  722. ' Call to translate short file path to long file path
  723. ' (Win98 and Win2k and above only - see comments for the
  724. ' GetLongFilePath_Legacy procedure)
  725. Private Declare Function GetLongPathName Lib "kernel32" _
  726.     (ByRef pszShortPath As String, _
  727.     ByRef lpszLongPath As String, _
  728.     ByVal cchBuffer As Long) As Long
  729.  
  730. ' Call to determine OS version
  731. Private Declare Function GetVersionExA Lib "kernel32" _
  732.     (lpVersionInformation As OSVERSIONINFO) As Integer
  733.  
  734. ' Message box API declaration
  735. Private Declare Function MessageBoxIndirect Lib "user32" _
  736.     Alias "MessageBoxIndirectA" _
  737.     (lpMsgBoxParams As MSGBOXPARAMS) As Long
  738.       
  739. 'local variable(s) to hold property value(s)
  740. Private mvarCHMFile As String
  741. Private mvarHHALink As String
  742. Private mvarHHDefaultURL As String
  743. Private mvarHHInstalled As Boolean
  744. Private mvarHHKeyword As String
  745. Private mvarHHMsgText As String
  746. Private mvarHHMsgTitle As String
  747. Private mvarHHShowOnTop As Boolean
  748. Private mvarHHTopicID As Long
  749. Private mvarHHTopicURL As String
  750. Private mvarHHWindow As String
  751. Private mvarHHRegFileName As String
  752. Private mvarHHRegFilePath As String
  753. Private mvarHHRegFileExists As Boolean
  754. Private mvarHHPopupFile As String
  755. Private mvarHHPopupType As PopupType
  756. Private mvarHHPopupText As String
  757. Private mvarHHPopupID As Long
  758. Private mvarHHPopupTextColor As Long
  759. Private mvarHHPopupBackColor As Long
  760. Private mvarHHPopupCustomTextColor As Long
  761. Private mvarHHPopupCustomBackColor As Long
  762. Private mvarHHPopupCustomColors As Boolean
  763. Private mvarHHPopupTextFont As String
  764. Private mvarHHPopupTextSize As String
  765. Private mvarHHPopupTextBold As Boolean
  766. Private mvarHHPopupTextItalic As Boolean
  767. Private mvarHHPopupTextUnderline As Boolean
  768. Private mvarHHCtrlPath As String
  769. Private mvarHHVersion As String
  770. Private mvarIEVersion As String
  771. Private mvarHHFriendlyName As String
  772. Private mvarIEFriendlyName As String
  773.  
  774. ' Module-level variables
  775. Private strHTMLHelpPath As String
  776. Private strWindow As String
  777. Private strTopic As String
  778. Private lngTopicID As Long
  779.  
  780. Public Sub HHDisplayTopicURL(Optional ByRef CallingForm As Long)
  781.  
  782. ' Displays a specific topic via the HHTopicURL property
  783.  
  784.   On Error GoTo ErrHandler
  785.     
  786.   Dim hwnd As Long
  787.     
  788.   If ValidHHFile(mvarCHMFile) = False Then
  789.     Exit Sub
  790.   End If
  791.     
  792.   If EnsureFileExists(mvarCHMFile) = False Then
  793.     Exit Sub
  794.   End If
  795.     
  796.   If Trim(mvarHHWindow) = "" Then
  797.     If mvarHHShowOnTop Then
  798.       htmlHelpTopic CallingForm, mvarCHMFile, _
  799.           HH_DISPLAY_TOPIC, mvarHHTopicURL
  800.     Else
  801.       htmlHelpTopic hwnd, mvarCHMFile, _
  802.           HH_DISPLAY_TOPIC, mvarHHTopicURL
  803.     End If
  804.   Else
  805.     If mvarHHShowOnTop Then
  806.       htmlHelpTopic CallingForm, mvarCHMFile & ">" & mvarHHWindow, _
  807.           HH_DISPLAY_TOPIC, mvarHHTopicURL
  808.     Else
  809.       htmlHelpTopic hwnd, mvarCHMFile & ">" & mvarHHWindow, _
  810.           HH_DISPLAY_TOPIC, mvarHHTopicURL
  811.     End If
  812.   End If
  813.     
  814.   Exit Sub
  815.  
  816. ErrHandler:
  817.     
  818.   Select Case Err.Number
  819.   Case 91
  820.     MessageBoxExclamation "The HHDisplayContents method was called " & _
  821.         "without a form being specified, while HHShowOnTop " & _
  822.         "was set to True."
  823.     Exit Sub
  824.   Case Else
  825.       Resume Next
  826.   End Select
  827.       
  828. End Sub
  829.  
  830. Public Sub HHDisplayTopicID(Optional CallingForm As Long)
  831.  
  832. ' Displays a specific topic via the HHTopicID property
  833.     
  834.   On Error GoTo ErrHandler
  835.     
  836.   Dim hwnd As Long
  837.     
  838.   If ValidHHFile(mvarCHMFile) = False Then
  839.     Exit Sub
  840.   End If
  841.     
  842.   If EnsureFileExists(mvarCHMFile) = False Then
  843.     Exit Sub
  844.   End If
  845.   
  846.   If Trim(mvarHHWindow) = "" Then
  847.     If mvarHHShowOnTop Then
  848.       HTMLHelp CallingForm, mvarCHMFile, _
  849.           HH_HELP_CONTEXT, mvarHHTopicID
  850.     Else
  851.       HTMLHelp hwnd, mvarCHMFile, _
  852.           HH_HELP_CONTEXT, mvarHHTopicID
  853.     End If
  854.   Else
  855.     If mvarHHShowOnTop Then
  856.       HTMLHelp CallingForm, mvarCHMFile & ">" & mvarHHWindow, _
  857.           HH_HELP_CONTEXT, mvarHHTopicID
  858.     Else
  859.       HTMLHelp hwnd, mvarCHMFile & ">" & mvarHHWindow, _
  860.           HH_HELP_CONTEXT, mvarHHTopicID
  861.     End If
  862.   End If
  863.     
  864.   Exit Sub
  865.  
  866. ErrHandler:
  867.     
  868.   Select Case Err.Number
  869.   Case 91
  870.     MessageBoxExclamation "The HHDisplayContents method was called " & _
  871.         "without a form being specified, while HHShowOnTop " & _
  872.         "was set to True."
  873.     Exit Sub
  874.   Case Else
  875.     Resume Next
  876.   End Select
  877.       
  878. End Sub
  879.  
  880. Public Sub HHDisplaySearch(Optional ByRef CallingForm As Long)
  881.  
  882. ' Forces the Help window to display the Search tab
  883.  
  884.   On Error GoTo ErrHandler
  885.     
  886.   Dim hwnd As Long
  887.     
  888.   If ValidHHFile(mvarCHMFile) = False Then
  889.     Exit Sub
  890.   End If
  891.     
  892.   If EnsureFileExists(mvarCHMFile) = False Then
  893.     Exit Sub
  894.   End If
  895.     
  896.   Dim HH_FTS_QUERY As tagHH_FTS_QUERY
  897.  
  898.   With HH_FTS_QUERY
  899.     .cbStruct = Len(HH_FTS_QUERY)
  900.     .fStemmedSearch = 0&
  901.     .fTitleOnly = 0&
  902.     .fUniCodeStrings = 0&
  903.     .iProximity = 0&
  904.     .pszSearchQuery = ""
  905.     .pszWindow = ""
  906.     .fExecute = 1&
  907.   End With
  908.     
  909.   If Trim(mvarHHWindow) = "" Then
  910.     If mvarHHShowOnTop Then
  911.       HTMLHelpCallSearch CallingForm, _
  912.           mvarCHMFile, _
  913.           HH_DISPLAY_SEARCH, HH_FTS_QUERY
  914.     Else
  915.       HTMLHelpCallSearch hwnd, _
  916.           mvarCHMFile, _
  917.           HH_DISPLAY_SEARCH, HH_FTS_QUERY
  918.     End If
  919.   Else
  920.     If mvarHHShowOnTop Then
  921.       HTMLHelpCallSearch CallingForm, _
  922.           mvarCHMFile & ">" & mvarHHWindow, _
  923.           HH_DISPLAY_SEARCH, HH_FTS_QUERY
  924.     Else
  925.       HTMLHelpCallSearch hwnd, _
  926.           mvarCHMFile & ">" & mvarHHWindow, _
  927.           HH_DISPLAY_SEARCH, HH_FTS_QUERY
  928.     End If
  929.   End If
  930.   Exit Sub
  931.  
  932. ErrHandler:
  933.     
  934.   Select Case Err.Number
  935.   Case 91
  936.     MessageBoxExclamation "The HHDisplayContents method was called " & _
  937.         "without a form being specified, while HHShowOnTop " & _
  938.         "was set to True."
  939.     Exit Sub
  940.   Case Else
  941.     Resume Next
  942.   End Select
  943.       
  944. End Sub
  945.  
  946. Public Sub HHDisplayKeyword(Optional ByRef CallingForm As Long)
  947.  
  948. ' Displays a topic specified by the HHKeyword property.
  949. ' This will search for a KLink keyword in the topics
  950. ' themselves.  Also searches the entries of an Index
  951. ' file (*.hhk) used in a tripane window.
  952.  
  953.   On Error GoTo ErrHandler
  954.     
  955.   Dim hwnd As Long
  956.     
  957.   If ValidHHFile(mvarCHMFile) = False Then
  958.     Exit Sub
  959.   End If
  960.     
  961.   If EnsureFileExists(mvarCHMFile) = False Then
  962.     Exit Sub
  963.   End If
  964.     
  965.   If mvarHHShowOnTop Then
  966.     htmlHelpTopic CallingForm, mvarCHMFile, _
  967.         HH_DISPLAY_TOPIC, vbNullString
  968.   Else
  969.     htmlHelpTopic hwnd, mvarCHMFile, _
  970.         HH_DISPLAY_TOPIC, vbNullString
  971.   End If
  972.     
  973.   Dim ALinkStruct As tagHH_AKLINK
  974.   
  975.   ALinkStruct.cbStruct = Len(ALinkStruct)
  976.   ALinkStruct.fReserved = False
  977.   ALinkStruct.pszKeywords = mvarHHKeyword
  978.     
  979.   ' Translate empty strings to Null strings
  980.   If mvarHHDefaultURL = "" Then
  981.     mvarHHDefaultURL = vbNullString
  982.   End If
  983.     
  984.   If mvarHHMsgText = "" Then
  985.     mvarHHMsgText = vbNullString
  986.   End If
  987.     
  988.   If mvarHHMsgTitle = "" Then
  989.     mvarHHMsgTitle = vbNullString
  990.   End If
  991.     
  992.   ' Set up the default topic to use if the
  993.   ' specified keyword is not found.  This is
  994.   ' set via the HHDefaultURL property.
  995.   ALinkStruct.pszUrl = mvarHHDefaultURL
  996.     
  997.   ' Set up the message box to display if the
  998.   ' specified keyword is not found.  These are
  999.   ' set via the HHMsgText and HHMshgTitle properties.
  1000.   ALinkStruct.pszMsgText = mvarHHMsgText
  1001.   ALinkStruct.pszMsgTitle = mvarHHMsgTitle
  1002.     
  1003.   ' Use the HHWindow property if it's set.
  1004.   If Trim(mvarHHWindow) <> "" Then
  1005.     ALinkStruct.pszWindow = mvarHHWindow
  1006.   End If
  1007.     
  1008.   ' Set to False to enable the default URL
  1009.   ' and message box functions.
  1010.   ALinkStruct.fIndexOnFail = False
  1011.     
  1012.   If mvarHHShowOnTop Then
  1013.     HTMLHelpKeyWord CallingForm, mvarCHMFile, _
  1014.         HH_KEYWORD_LOOKUP, ALinkStruct
  1015.   Else
  1016.     HTMLHelpKeyWord hwnd, mvarCHMFile, _
  1017.         HH_KEYWORD_LOOKUP, ALinkStruct
  1018.   End If
  1019.     
  1020.   Exit Sub
  1021.  
  1022. ErrHandler:
  1023.     
  1024.   Select Case Err.Number
  1025.   Case 91
  1026.     MessageBoxExclamation "The HHDisplayContents method was called " & _
  1027.         "without a form being specified, while HHShowOnTop " & _
  1028.         "was set to True."
  1029.     Exit Sub
  1030.   Case Else
  1031.     Resume Next
  1032.   End Select
  1033.       
  1034. End Sub
  1035.  
  1036. Public Sub HHDisplayIndex(Optional ByRef CallingForm As Long)
  1037.  
  1038. ' Force the Help window to display the Index file
  1039. ' (*.hhk) in the left pane
  1040.  
  1041.   On Error GoTo ErrHandler
  1042.     
  1043.   Dim hwnd As Long
  1044.     
  1045.   If ValidHHFile(mvarCHMFile) = False Then
  1046.     Exit Sub
  1047.   End If
  1048.     
  1049.   If EnsureFileExists(mvarCHMFile) = False Then
  1050.     Exit Sub
  1051.   End If
  1052.   
  1053.   If Trim(mvarHHWindow) = "" Then
  1054.     If mvarHHShowOnTop Then
  1055.       HTMLHelp CallingForm, mvarCHMFile, _
  1056.           HH_DISPLAY_INDEX, 0
  1057.     Else
  1058.       HTMLHelp hwnd, mvarCHMFile, _
  1059.           HH_DISPLAY_INDEX, 0
  1060.     End If
  1061.   Else
  1062.     If mvarHHShowOnTop Then
  1063.       HTMLHelp CallingForm, mvarCHMFile & ">" & mvarHHWindow, _
  1064.           HH_DISPLAY_INDEX, 0
  1065.     Else
  1066.       HTMLHelp hwnd, mvarCHMFile & ">" & mvarHHWindow, _
  1067.           HH_DISPLAY_INDEX, 0
  1068.     End If
  1069.   End If
  1070.     
  1071.   Exit Sub
  1072.  
  1073. ErrHandler:
  1074.     
  1075.   Select Case Err.Number
  1076.   Case 91
  1077.     MessageBoxExclamation "The HHDisplayContents method was called " & _
  1078.         "without a form being specified, while HHShowOnTop " & _
  1079.         "was set to True."
  1080.     Exit Sub
  1081.   Case Else
  1082.     Resume Next
  1083.   End Select
  1084.       
  1085. End Sub
  1086.  
  1087. Public Sub HHDisplayContents(Optional ByRef CallingForm As Long)
  1088.     
  1089. ' Force the Help window to display the Contents file
  1090. ' (*.hhc) in the left pane
  1091.     
  1092.   On Error GoTo ErrHandler
  1093.     
  1094.   Dim hwnd As Long
  1095.     
  1096.   If ValidHHFile(mvarCHMFile) = False Then
  1097.     Exit Sub
  1098.   End If
  1099.     
  1100.   If EnsureFileExists(mvarCHMFile) = False Then
  1101.     Exit Sub
  1102.   End If
  1103.     
  1104.   If Trim(mvarHHWindow) = "" Then
  1105.     If mvarHHShowOnTop Then
  1106.       HTMLHelp CallingForm, mvarCHMFile, _
  1107.           HH_DISPLAY_TOC, 0
  1108.     Else
  1109.       HTMLHelp hwnd, mvarCHMFile, _
  1110.           HH_DISPLAY_TOC, 0
  1111.     End If
  1112.   Else
  1113.     If mvarHHShowOnTop Then
  1114.       HTMLHelp CallingForm, mvarCHMFile & ">" & mvarHHWindow, _
  1115.           HH_DISPLAY_TOC, 0
  1116.     Else
  1117.       HTMLHelp hwnd, mvarCHMFile & ">" & mvarHHWindow, _
  1118.           HH_DISPLAY_TOC, 0
  1119.     End If
  1120.   End If
  1121.     
  1122.   Exit Sub
  1123.  
  1124. ErrHandler:
  1125.     
  1126.   Select Case Err.Number
  1127.   Case 91
  1128.     MessageBoxExclamation "The HHDisplayContents method was called " & _
  1129.         "without a form being specified, while HHShowOnTop " & _
  1130.         "was set to True."
  1131.     Exit Sub
  1132.   Case Else
  1133.     Resume Next
  1134.   End Select
  1135.       
  1136. End Sub
  1137.  
  1138. Public Sub HHDisplayALink(Optional ByRef CallingForm As Long)
  1139.  
  1140. ' Displays a topic specified by the HHALink property.
  1141.  
  1142.   On Error GoTo ErrHandler
  1143.     
  1144.   Dim hwnd As Long
  1145.     
  1146.   If ValidHHFile(mvarCHMFile) = False Then
  1147.     Exit Sub
  1148.   End If
  1149.     
  1150.   If EnsureFileExists(mvarCHMFile) = False Then
  1151.     Exit Sub
  1152.   End If
  1153.  
  1154.   Dim ALinkStruct As tagHH_AKLINK
  1155.   
  1156.   ALinkStruct.cbStruct = Len(ALinkStruct)
  1157.   ALinkStruct.fReserved = False
  1158.   ALinkStruct.pszKeywords = mvarHHALink
  1159.     
  1160.   ' Translate empty strings to Null strings
  1161.   If mvarHHDefaultURL = "" Then
  1162.     mvarHHDefaultURL = vbNullString
  1163.   End If
  1164.     
  1165.   If mvarHHMsgText = "" Then
  1166.     mvarHHMsgText = vbNullString
  1167.   End If
  1168.     
  1169.   If mvarHHMsgTitle = "" Then
  1170.     mvarHHMsgTitle = vbNullString
  1171.   End If
  1172.     
  1173.   ' Set up the default topic to use if the
  1174.   ' specified keyword is not found.  This is
  1175.   ' set via the HHDefaultURL property.
  1176.   ALinkStruct.pszUrl = mvarHHDefaultURL
  1177.     
  1178.   ' Set up the message box to display if the
  1179.   ' specified keyword is not found.  These are
  1180.   ' set via the HHMsgText and HHMshgTitle properties.
  1181.   ALinkStruct.pszMsgText = mvarHHMsgText
  1182.   ALinkStruct.pszMsgTitle = mvarHHMsgTitle
  1183.     
  1184.   ' Use the HHWindow property if it's set.
  1185.   If Trim(mvarHHWindow) <> "" Then
  1186.     ALinkStruct.pszWindow = mvarHHWindow
  1187.   End If
  1188.     
  1189.   ' Set to False to enable the default URL
  1190.   ' and message box functions.
  1191.   ALinkStruct.fIndexOnFail = False
  1192.   
  1193.   If mvarHHShowOnTop Then
  1194.     HTMLHelpKeyWord CallingForm, mvarCHMFile, _
  1195.         HH_ALINK_LOOKUP, ALinkStruct
  1196.   Else
  1197.     HTMLHelpKeyWord hwnd, mvarCHMFile, _
  1198.         HH_ALINK_LOOKUP, ALinkStruct
  1199.   End If
  1200.     
  1201.   Exit Sub
  1202.  
  1203. ErrHandler:
  1204.     
  1205.   Select Case Err.Number
  1206.   Case 91
  1207.     MessageBoxExclamation "The HHDisplayContents method was called " & _
  1208.         "without a form being specified, while HHShowOnTop " & _
  1209.         "was set to True."
  1210.     Exit Sub
  1211.   Case Else
  1212.     Resume Next
  1213.   End Select
  1214.       
  1215. End Sub
  1216.  
  1217. Public Sub HHRegister(FileToRegister As String)
  1218.  
  1219. ' Registers the specified HTML Help file in
  1220. ' HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\HTML Help
  1221.  
  1222.   Dim lngHandle As Long
  1223.   Dim lngDisposition As Long
  1224.   Dim lngLenData As Long
  1225.   Dim lngResult As Long
  1226.   Dim strValue As String
  1227.   Dim secSecAttributes As SECURITY_ATTRIBUTES
  1228.   Dim strFilePath As String
  1229.   Dim intPosition As Integer
  1230.   Dim intLength As Integer
  1231.   
  1232.   If FileToRegister = "" Then Exit Sub
  1233.   
  1234.   If ValidHHFile(FileToRegister) = False Then Exit Sub
  1235.   
  1236.   GetLongPath_Legacy FileToRegister, FileToRegister, 256
  1237.   
  1238.   HHCheckRegistry FileToRegister
  1239.     
  1240.   If (mvarHHRegFileName <> "") Then
  1241.       
  1242.     ' The file is registered to begin with,
  1243.     ' so we need to say so and exit.
  1244.     MessageBoxInformation "The file " & FileToRegister & " is already registered.  " & _
  1245.         "HHRegister will not be run as no action need be taken."
  1246.     Exit Sub
  1247.       
  1248.   End If
  1249.   
  1250.   ' Copy it to get the path later
  1251.   strFilePath = FileToRegister
  1252.   
  1253.   If ValidHHFile(FileToRegister) = False Then
  1254.     Exit Sub
  1255.   Else
  1256.   
  1257.     If EnsureFileExists(FileToRegister) = False Then
  1258.       Exit Sub
  1259.     End If
  1260.     If InStr(FileToRegister, "\") = 0 Then
  1261.       MessageBoxExclamation "Cannot register " & FileToRegister & " without having a supplied path."""
  1262.       Exit Sub
  1263.     Else
  1264.       ' strip the file name itself off the path
  1265.       intPosition = 1
  1266.     
  1267.       Do While intPosition <> 0
  1268.         intLength = Len(FileToRegister)
  1269.         intPosition = InStr(1, FileToRegister, "\")
  1270.         FileToRegister = Right(FileToRegister, (intLength - intPosition))
  1271.       Loop
  1272.     
  1273.       ' Get the registered path
  1274.       strFilePath = Left(strFilePath, Len(strFilePath) - Len(FileToRegister))
  1275.     
  1276.       ' Register it
  1277.       lngResult = 99
  1278.  
  1279.       lngResult = RegCreateKeyEx(HKEY_LOCAL_MACHINE, _
  1280.           "Software\Microsoft\Windows\HTML Help", _
  1281.           0, _
  1282.           "", _
  1283.           REG_OPTION_NON_VOLATILE, _
  1284.           KEY_CREATE_SUB_KEY Or KEY_SET_VALUE, _
  1285.           secSecAttributes, _
  1286.           lngHandle, _
  1287.           lngDisposition)
  1288.       
  1289.       If lngResult <> ERROR_SUCCESS Then
  1290.         GoTo WriteRegValueError
  1291.       End If
  1292.     
  1293.       strValue = strFilePath
  1294.       lngLenData = Len(strValue) + 1
  1295.       lngResult = RegSetValueEx(lngHandle, _
  1296.           FileToRegister, _
  1297.           0, _
  1298.           REG_SZ, _
  1299.           ByVal strValue, _
  1300.           lngLenData)
  1301.     
  1302.       If lngResult = ERROR_SUCCESS Then
  1303.         lngResult = RegCloseKey(lngHandle)
  1304.         Exit Sub
  1305.       End If
  1306.       
  1307.     End If
  1308.   End If
  1309.   
  1310.   HHCheckRegistry CStr(FileToRegister)
  1311.   
  1312.   Exit Sub
  1313.  
  1314. WriteRegValueError:
  1315.   MessageBoxExclamation "HTML Help Class: HHRegister Error"
  1316.  
  1317. End Sub
  1318.  
  1319. Public Sub HHUnRegister(FileToUnRegister As String)
  1320.  
  1321. ' Deletes the entry for the specified HTML Help file from
  1322. ' HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\HTML Help
  1323.  
  1324.   Dim lngResult As Long
  1325.   Dim strFilePath As String
  1326.   Dim intPosition As Integer
  1327.   Dim intLength As Integer
  1328.   Dim lngHandle As Long
  1329.   
  1330.   If FileToUnRegister = "" Then Exit Sub
  1331.   
  1332.   If ValidHHFile(FileToUnRegister) = False Then Exit Sub
  1333.     
  1334.   GetLongPath_Legacy FileToUnRegister, FileToUnRegister, 256
  1335.   
  1336.   HHCheckRegistry FileToUnRegister
  1337.     
  1338.   If (mvarHHRegFileName = "") Then
  1339.       
  1340.     ' The file isn't registered to begin with,
  1341.     ' so we need to say so and exit.
  1342.     MessageBoxInformation "The file " & FileToUnRegister & " is not registered.  " & _
  1343.         "HHUnRegister will not be run as no action need be taken."
  1344.       
  1345.     Exit Sub
  1346.       
  1347.   End If
  1348.     
  1349.   ' strip the file name itself off the path
  1350.   intPosition = 1
  1351.     
  1352.   Do While intPosition <> 0
  1353.     intLength = Len(FileToUnRegister)
  1354.     intPosition = InStr(1, FileToUnRegister, "\")
  1355.     FileToUnRegister = Right(FileToUnRegister, (intLength - intPosition))
  1356.   Loop
  1357.     
  1358.   ' Delete the entry
  1359.   lngResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _
  1360.       "Software\Microsoft\Windows\HTML Help", _
  1361.       0, _
  1362.       KEY_SET_VALUE, _
  1363.       lngHandle)
  1364.       
  1365.   If lngResult = ERROR_SUCCESS Then
  1366.     lngResult = RegDeleteValue(lngHandle, FileToUnRegister)
  1367.   End If
  1368.   
  1369.   HHCheckRegistry CStr(FileToUnRegister)
  1370.   
  1371. End Sub
  1372.  
  1373. Public Function HHCheckRegistry(ByRef FileToCheck As String) As Variant
  1374.  
  1375. ' Verifies the specified HTML Help file has been registered in
  1376. ' HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\HTML Help
  1377.  
  1378.   Dim sValues As String
  1379.   Dim intLength As Integer
  1380.   Dim boolResult As Boolean
  1381.   Dim intPosition As Integer
  1382.   Dim intFileNamePos As Integer
  1383.   Dim varRegValues As HH_REG_VALUES
  1384.   Dim strTempFileName As String
  1385.   
  1386.   ' Reassign the file name so the original
  1387.   ' doesn't become mangled
  1388.   strTempFileName = FileToCheck
  1389.   
  1390.   If strTempFileName = "" Then
  1391.     Exit Function
  1392.   End If
  1393.   
  1394.   HHCheckRegistry = False
  1395.   mvarHHRegFileExists = False
  1396.   
  1397.   If ValidHHFile(strTempFileName) = False Then
  1398.     Exit Function
  1399.   Else
  1400.     ' strip the file name itself off the path
  1401.     intPosition = 1
  1402.     
  1403.     Do While intPosition <> 0
  1404.       intLength = Len(strTempFileName)
  1405.       intPosition = InStr(1, strTempFileName, "\")
  1406.       strTempFileName = Right(strTempFileName, (intLength - intPosition))
  1407.     Loop
  1408.     
  1409.     ' Verify it
  1410.     varRegValues = EnumRegValue("HKLM", "Software\Microsoft\Windows\HTML Help", sValues, strTempFileName)
  1411.     
  1412.     With varRegValues
  1413.       If .pszFileName = strTempFileName Then
  1414.         
  1415.         ' Load the verified file name into the HHRegFileName
  1416.         ' property, and the registered path of the file into
  1417.         ' the HHRegFilePath property.
  1418.         Dim tempHHRegFilePath As String
  1419.         mvarHHRegFileName = .pszFileName
  1420.         tempHHRegFilePath = Right(.pszFilePath, Len(.pszFilePath) - InStr(.pszFilePath, "="))
  1421.         tempHHRegFilePath = Left(tempHHRegFilePath, (Len(tempHHRegFilePath) - 2))
  1422.         
  1423.         GetLongPath_Legacy tempHHRegFilePath, mvarHHRegFilePath, 256
  1424.         
  1425.         Dim lpFindFileData As WIN32_FIND_DATA
  1426.         Dim lngHandle As Long
  1427.         
  1428.         ' Verify the HTML Help file exists according to the
  1429.         ' registry data.
  1430.         boolResult = EnsureFileExists(mvarHHRegFilePath & "\" & mvarHHRegFileName)
  1431.         
  1432.         If boolResult Then
  1433.         
  1434.           ' If the file's in the registered location,
  1435.           ' set HHRegFileExists to True.
  1436.           mvarHHRegFileExists = True
  1437.           
  1438.         End If
  1439.       Else
  1440.         
  1441.         ' If the file isn't registered, clear the
  1442.         ' HHRegFileName and HHRegFilePath properties.
  1443.         mvarHHRegFileName = ""
  1444.         mvarHHRegFilePath = ""
  1445.         
  1446.       End If
  1447.     End With
  1448.     
  1449.   End If
  1450.   
  1451. End Function
  1452.  
  1453. Public Sub HHClose()
  1454.   
  1455. ' Closes all open HTML Help windows.  Be careful when
  1456. ' using this as it closes everything, not just the
  1457. ' HTML Help windows for this app.
  1458.   
  1459.   On Error Resume Next
  1460.     
  1461.   Dim hwnd As Long
  1462.  
  1463.   HTMLHelp hwnd, mvarCHMFile, HH_CLOSE_ALL, 0
  1464.     
  1465. End Sub
  1466.  
  1467. Public Function HHSetHelpFile(ByVal intSelHelpFile As Integer) As String
  1468.   
  1469. ' Set the string variable to
  1470. ' include the application path
  1471.  
  1472.   Select Case intSelHelpFile
  1473.   Case 1
  1474.     HHSetHelpFile = App.Path & "\Library.chm"
  1475.   Case 2
  1476.     ' Popup text file for the above CHM
  1477.     HHSetHelpFile = "Library.txt"
  1478.   Case Else
  1479.     ' list other HTML Help files here
  1480.   End Select
  1481.   
  1482. End Function
  1483.  
  1484. Public Sub HHDisplayPopup(ByRef CallingForm As Long)
  1485.  
  1486. ' Displays a text popup from any of three sources
  1487. ' and with a number of options
  1488.   
  1489.   If mvarHHPopupType = 0 Then
  1490.     Exit Sub
  1491.   End If
  1492.  
  1493.   Dim pPoint As POINTAPI
  1494.   Dim hPopup As tagHH_POPUP
  1495.   Dim rRect As RECT
  1496.   Dim hwnd As Long
  1497.   Dim strFontString As String
  1498.   
  1499.   If mvarHHPopupType = HH_CHM_POPUP Then
  1500.     
  1501.     ' Check for a valid CHM if that option is selected
  1502.     
  1503.     If ValidHHFile(mvarCHMFile) = False Then
  1504.       Exit Sub
  1505.     End If
  1506.     
  1507.     If EnsureFileExists(mvarCHMFile) = False Then
  1508.       Exit Sub
  1509.     End If
  1510.     
  1511.   End If
  1512.   
  1513.   ' Get the current mouse pointer position
  1514.   GetCursorPos& pPoint
  1515.   
  1516.   ' Set the margins of the popup
  1517.   With rRect
  1518.     .Bottom = -1
  1519.     .Left = -1
  1520.     .Right = -1
  1521.     .Top = -1
  1522.   End With
  1523.   
  1524.   With hPopup
  1525.     .cbStruct = Len(hPopup)
  1526.   
  1527.     ' Clear any previously used color scheme
  1528.     .clrForeground = 0
  1529.     .clrBackground = 0
  1530.     
  1531.     If mvarHHPopupType = HH_RESOURCE_POPUP Then
  1532.     
  1533.       ' Fudge the Resource function by actually
  1534.       ' using HH_TEXT_POPUP
  1535.       .pszText = LoadResString(mvarHHPopupID)
  1536.       .hinst = 0
  1537.       
  1538.     ElseIf mvarHHPopupType = HH_TEXT_POPUP Then
  1539.     
  1540.       .idString = 0
  1541.       
  1542.       ' End the sub if no string is supplied
  1543.       If mvarHHPopupText = "" Then
  1544.         Exit Sub
  1545.       End If
  1546.       .pszText = mvarHHPopupText
  1547.       
  1548.     Else
  1549.       
  1550.       .idString = mvarHHPopupID
  1551.       .pszText = vbNullString
  1552.       
  1553.     End If
  1554.     
  1555.     ' Match the popup coordinates to the current
  1556.     ' mouse pointer coordinates
  1557.     .pt = pPoint
  1558.     
  1559.     If mvarHHPopupCustomColors = True Then
  1560.       .clrForeground = mvarHHPopupCustomTextColor
  1561.       .clrBackground = mvarHHPopupCustomBackColor
  1562.     Else
  1563.       .clrForeground = mvarHHPopupTextColor
  1564.       .clrBackground = mvarHHPopupBackColor
  1565.     End If
  1566.     
  1567.     .rcMargins = rRect
  1568.     
  1569.     Dim strBold As String
  1570.     Dim strItalic As String
  1571.     Dim strUnderline As String
  1572.     
  1573.     If mvarHHPopupTextFont = "" Then
  1574.       mvarHHPopupTextFont = "Arial"
  1575.     End If
  1576.     
  1577.     If mvarHHPopupTextSize = "" Then
  1578.       mvarHHPopupTextSize = "10"
  1579.     End If
  1580.     
  1581.     If mvarHHPopupTextBold = True Then
  1582.       strBold = "Bold "
  1583.     Else
  1584.       strBold = ""
  1585.     End If
  1586.     
  1587.     If mvarHHPopupTextItalic = True Then
  1588.       strItalic = "Italic "
  1589.     Else
  1590.       strItalic = ""
  1591.     End If
  1592.     
  1593.     If mvarHHPopupTextUnderline = True Then
  1594.       strUnderline = "Underline"
  1595.     Else
  1596.       strUnderline = ""
  1597.     End If
  1598.     
  1599.     strFontString = mvarHHPopupTextFont & ", " & _
  1600.         mvarHHPopupTextSize & ", ascii, " & _
  1601.         strBold & strItalic & strUnderline
  1602.         
  1603.     .pszFont = strFontString
  1604.     
  1605.   End With
  1606.   
  1607.   Select Case mvarHHPopupType
  1608.   Case HH_CHM_POPUP
  1609.   
  1610.     If ValidPopupFile(mvarHHPopupFile) = False Then
  1611.       Exit Sub
  1612.     Else
  1613.       htmlHelpTextPopup CallingForm, _
  1614.         mvarCHMFile & "::/" & mvarHHPopupFile, _
  1615.         HH_DISPLAY_TEXT_POPUP, hPopup
  1616.     End If
  1617.     
  1618.   Case HH_RESOURCE_POPUP
  1619.     htmlHelpTextPopup CallingForm, vbNullString, _
  1620.       HH_DISPLAY_TEXT_POPUP, hPopup
  1621.     
  1622.   Case HH_TEXT_POPUP
  1623.     htmlHelpTextPopup CallingForm, vbNullString, _
  1624.       HH_DISPLAY_TEXT_POPUP, hPopup
  1625.       
  1626.   Case Else
  1627.     Exit Sub
  1628.   End Select
  1629.   
  1630.   ' Clear the color and font scheme before the next use
  1631.   mvarHHPopupCustomTextColor = 0
  1632.   mvarHHPopupCustomBackColor = 0
  1633.   mvarHHPopupTextColor = 0
  1634.   mvarHHPopupBackColor = 0
  1635.   mvarHHPopupTextFont = "Arial"
  1636.   mvarHHPopupTextSize = "10"
  1637.   mvarHHPopupTextBold = False
  1638.   mvarHHPopupTextItalic = False
  1639.   mvarHHPopupTextUnderline = False
  1640.   
  1641. End Sub
  1642.  
  1643. Public Sub HHInvokeWhatsThisHelp(CallingForm As Long)
  1644.   
  1645. ' Sets the mouse pointer to the What's This pointer.
  1646. ' When the left button is clicked again, What's This
  1647. ' is invoked for the control below the cursor.
  1648.  
  1649.   DefWindowProc CallingForm, WM_SYSCOMMAND, _
  1650.       SC_CONTEXTHELP, 0
  1651.  
  1652. End Sub
  1653.  
  1654. Public Function HHVerifyMinConfig(MinHHVersion As HHVersion, _
  1655.     MinIEVersion As IEVersion) As Boolean
  1656.   
  1657. ' Verifies the minimum HTML Help and IE versions
  1658. ' as specified by the developer.
  1659.     
  1660.   Dim boolHHVerified As Boolean
  1661.   Dim boolIEVerified As Boolean
  1662.   
  1663.   GetHHVersion
  1664.   
  1665.   GetIEVersion
  1666.   
  1667.   HHVerifyMinConfig = False
  1668.   
  1669.   Select Case MinHHVersion
  1670.   Case HH_1_0
  1671.     If mvarHHVersion >= extHH_1_0 Then
  1672.       boolHHVerified = True
  1673.     End If
  1674.   Case HH_1_1
  1675.     If mvarHHVersion >= extHH_1_1 Then
  1676.       boolHHVerified = True
  1677.     End If
  1678.   Case HH_1_1A
  1679.     If mvarHHVersion >= extHH_1_1A Then
  1680.       boolHHVerified = True
  1681.     End If
  1682.   Case HH_1_1B
  1683.     If mvarHHVersion >= extHH_1_1B Then
  1684.       boolHHVerified = True
  1685.     End If
  1686.   Case HH_1_2
  1687.     If mvarHHVersion >= extHH_1_2 Then
  1688.       boolHHVerified = True
  1689.     End If
  1690.   Case HH_1_21
  1691.     If mvarHHVersion >= extHH_1_21 Then
  1692.       boolHHVerified = True
  1693.     End If
  1694.   Case HH_1_21A
  1695.     If mvarHHVersion >= extHH_1_21A Then
  1696.       boolHHVerified = True
  1697.     End If
  1698.   Case HH_1_22
  1699.     If mvarHHVersion >= extHH_1_22 Then
  1700.       boolHHVerified = True
  1701.     End If
  1702.   Case HH_1_22
  1703.     If mvarHHVersion >= extHH_1_3 Then
  1704.       boolHHVerified = True
  1705.     End If
  1706.   Case Else
  1707.     mvarHHVersion = extUNKNOWN
  1708.   End Select
  1709.  
  1710.   Select Case MinIEVersion
  1711.   Case IE_3_0
  1712.     If mvarIEVersion >= extIE_3_0 Then
  1713.       boolIEVerified = True
  1714.     End If
  1715.   Case IE_3_0_OSR2
  1716.     If mvarIEVersion >= extIE_3_0_OSR2 Then
  1717.       boolIEVerified = True
  1718.     End If
  1719.   Case IE_3_01
  1720.     If mvarIEVersion >= extIE_3_01 Then
  1721.       boolIEVerified = True
  1722.     End If
  1723.   Case IE_3_02
  1724.     If mvarIEVersion >= extIE_3_02 Then
  1725.       boolIEVerified = True
  1726.     End If
  1727.   Case IE_4_0_PP2
  1728.     If mvarIEVersion >= extIE_4_0_PP2 Then
  1729.       boolIEVerified = True
  1730.     End If
  1731.   Case IE_4_0
  1732.     If mvarIEVersion >= extIE_4_0 Then
  1733.       boolIEVerified = True
  1734.     End If
  1735.   Case IE_4_01
  1736.     If mvarIEVersion >= extIE_4_01 Then
  1737.       boolIEVerified = True
  1738.     End If
  1739.   Case IE_4_01_SP1
  1740.     If mvarIEVersion >= extIE_4_01_SP1 Then
  1741.       boolIEVerified = True
  1742.     End If
  1743.   Case IE_4_01_SP2
  1744.     If mvarIEVersion >= extIE_4_01_SP2 Then
  1745.       boolIEVerified = True
  1746.     End If
  1747.   Case IE_5_0_Beta1
  1748.     If mvarIEVersion >= extIE_5_0_Beta1 Then
  1749.       boolIEVerified = True
  1750.     End If
  1751.   Case IE_5_0_Beta2
  1752.     If mvarIEVersion >= extIE_5_0_Beta2 Then
  1753.       boolIEVerified = True
  1754.     End If
  1755.   Case IE_5_0
  1756.     If mvarIEVersion >= extIE_5_0 Then
  1757.       boolIEVerified = True
  1758.     End If
  1759.   Case IE_5_0A
  1760.     If mvarIEVersion >= extIE_5_0A Then
  1761.       boolIEVerified = True
  1762.     End If
  1763.   Case IE_5_0B
  1764.     If mvarIEVersion >= extIE_5_0B Then
  1765.       boolIEVerified = True
  1766.     End If
  1767.   Case IE_5_0C
  1768.     If mvarIEVersion >= extIE_5_0C Then
  1769.       boolIEVerified = True
  1770.     End If
  1771.   Case Else
  1772.     mvarIEVersion = extUNKNOWN
  1773.   End Select
  1774.   
  1775.   GetHHFriendlyName
  1776.   GetIEFriendlyName
  1777.   
  1778.   HHVerifyMinConfig = (boolHHVerified And boolIEVerified)
  1779.   
  1780. End Function
  1781.  
  1782. Private Function GetVersionInfo(FileName) As String
  1783.  
  1784. ' Retrieves the file version information for
  1785. ' the specified file
  1786.   
  1787.   Dim varVersionSize As Long
  1788.   Dim varVersionHwnd As Long
  1789.   Dim bytVerBuf() As Byte
  1790.   Dim lngResult As Long
  1791.   Dim ffi As VS_FIXEDFILEINFO
  1792.   Dim ffiAddr As Long
  1793.   Dim ffiLen As Long
  1794.   Dim di As Long
  1795.   
  1796.   varVersionSize = GetFileVersionInfoSize(FileName, varVersionHwnd)
  1797.   If varVersionSize > 64000 Then varVersionSize = 64000
  1798.   
  1799.   ReDim bytVerBuf(varVersionSize + 1)
  1800.   
  1801.   lngResult = GetFileVersionInfo(FileName, varVersionHwnd, varVersionSize, bytVerBuf(0))
  1802.   di = VerQueryValue(bytVerBuf(0), "\", ffiAddr, ffiLen)
  1803.   
  1804.   CopyMem ffi, ByVal ffiAddr, Len(ffi)
  1805.   
  1806.   GetVersionInfo = Format$(ffi.dwFileVersionMSh) & "." & _
  1807.       Format$(ffi.dwFileVersionMSl, "00") & "."
  1808.       
  1809.   If ffi.dwFileVersionLSh > 0 Then
  1810.     GetVersionInfo = GetVersionInfo & Format$(ffi.dwFileVersionLSh, "00") & "." & _
  1811.         Format$(ffi.dwFileVersionLSl, "00")
  1812.   Else
  1813.     GetVersionInfo = GetVersionInfo & Format$(ffi.dwFileVersionLSl, "0000")
  1814.   End If
  1815.   
  1816. End Function
  1817.  
  1818. Private Function ValidHHFile(FileToVerify) As Boolean
  1819.  
  1820. ' Verifies the suffix for the specified CHM
  1821. ' Note this procedure does not verify actual CHM
  1822.   
  1823.   ValidHHFile = True
  1824.   
  1825.   If Right(FileToVerify, 3) <> "chm" Then
  1826.     MessageBoxExclamation FileToVerify & " is not a valid HTML Help file."
  1827.     Exit Function
  1828.   End If
  1829.  
  1830. End Function
  1831.  
  1832. Private Function ValidPopupFile(FileToVerify) As Boolean
  1833.  
  1834. ' Verifies the suffix for the specified popup text file
  1835. ' Note this procedure does not verify actual popup text file
  1836.   
  1837.   ValidPopupFile = True
  1838.   
  1839.   If Right(FileToVerify, 3) <> "txt" Then
  1840.     MessageBoxExclamation "The file specified as the text popup source, '" & _
  1841.         FileToVerify & "', is not a valid popup file."
  1842.     Exit Function
  1843.   End If
  1844.  
  1845. End Function
  1846.  
  1847. Public Function EnsureFileExists(ByRef FileToFind As String) As Boolean
  1848.  
  1849. ' Ensures the specified file exists in its specified location
  1850.  
  1851.   Dim lpFindFileData As WIN32_FIND_DATA
  1852.   Dim lngHandle As Long
  1853.   
  1854.   EnsureFileExists = True
  1855.   
  1856.   If (InStr(FileToFind, "\") = 0) Then
  1857.     ' Check to see if the file is registered
  1858.     HHCheckRegistry FileToFind
  1859.     
  1860.     If mvarHHRegFileName <> "" Then
  1861.       ' If it's registered, use the registry info
  1862.       FileToFind = mvarHHRegFilePath & mvarHHRegFileName
  1863.     Else
  1864.       ' Otherwise, assume it's in App.Path
  1865.       FileToFind = App.Path & "\" & FileToFind
  1866.     End If
  1867.   End If
  1868.   
  1869.   lngHandle = FindFirstFile(FileToFind, lpFindFileData)
  1870.   
  1871.   If (lngHandle) = INVALID_HANDLE_VALUE Then
  1872.         
  1873.     MessageBoxExclamation "The file " & FileToFind & " does not exist." & Chr(10) & _
  1874.         "Please make sure the correct path and file name have been specified."
  1875.         
  1876.     EnsureFileExists = False
  1877.     
  1878.   Else
  1879.   
  1880.     FindClose lngHandle
  1881.     
  1882.   End If
  1883.   
  1884. End Function
  1885.  
  1886. Private Function EnumRegValue(ByVal strTopKey As String, _
  1887.     ByVal strSubKey As String, _
  1888.     strValues As String, _
  1889.     FileToCheck As String) As HH_REG_VALUES
  1890.  
  1891. ' Enumerates registry values
  1892.  
  1893.   Dim strTempFileName As String
  1894.   Dim lngTopKey As Long
  1895.   Dim lngHandle As Long
  1896.   Dim lngResult As Long
  1897.   Dim lngValueLen As Long
  1898.   Dim lngIndex As Long
  1899.   Dim lngValue As Long
  1900.   Dim lngValueType As Long
  1901.   Dim lngData As Long
  1902.   Dim lngDataLen As Long
  1903.   Dim boolDone As Boolean
  1904.   Dim strValueName As String
  1905.   Dim strValue As String
  1906.   Dim strValueEx As String
  1907.   Dim HHRegValues As HH_REG_VALUES
  1908.  
  1909.   On Error GoTo EnumRegValueError
  1910.  
  1911.   ' Reassign the file name so the original
  1912.   ' doesn't become mangled
  1913.   strTempFileName = FileToCheck
  1914.  
  1915.   ' Clear any previous result
  1916.   EnumRegValue.pszFileName = ""
  1917.   EnumRegValue.pszFilePath = ""
  1918.  
  1919.   lngResult = 99
  1920.   lngTopKey = RegKeyID(strTopKey)
  1921.   
  1922.   If lngTopKey = 0 Then GoTo EnumRegValueError
  1923.  
  1924.   lngResult = RegOpenKeyEx(lngTopKey, strSubKey, 0, _
  1925.       KEY_QUERY_VALUE, lngHandle)
  1926.   If lngResult <> ERROR_SUCCESS Then GoTo EnumRegValueError
  1927.     
  1928.   Do While Not boolDone
  1929.         
  1930.     lngDataLen = MAX_SIZE
  1931.     lngValueLen = lngDataLen
  1932.     strValueName = Space$(lngDataLen)
  1933.         
  1934.     lngResult = RegEnumValue(lngHandle, lngIndex, _
  1935.         strValueName, lngValueLen, 0, lngValueType, _
  1936.         ByVal lngData, lngDataLen)
  1937.         
  1938.     If lngResult = ERROR_SUCCESS Then
  1939.     
  1940.       Select Case lngValueType
  1941.       Case REG_SZ, REG_EXPAND_SZ
  1942.         strValue = Space$(lngDataLen)
  1943.         strValueName = Left$(strValueName, lngValueLen)
  1944.         
  1945.         If strValueName = strTempFileName Then
  1946.           HHRegValues.pszFileName = strTempFileName
  1947.           lngResult = RegQueryValueEx(lngHandle, _
  1948.               strValueName, 0, lngValueType, _
  1949.               ByVal strValue, lngDataLen)
  1950.               
  1951.           If lngValueType = REG_EXPAND_SZ Then
  1952.             strValueEx = strValue
  1953.             strValue = String(MAX_SIZE, " ")
  1954.             lngValueLen = ExpandEnvironmentStrings(strValueEx, strValue, MAX_SIZE)
  1955.           End If
  1956.           
  1957.           If lngResult = ERROR_SUCCESS Then
  1958.             strValues = strValues & strValueName & _
  1959.                 "=" & strValue & vbCr
  1960.             HHRegValues.pszFilePath = strValues
  1961.                             
  1962.           Else
  1963.             GoTo EnumRegValueError
  1964.           End If
  1965.           
  1966.           GoTo ExitRoutine
  1967.           
  1968.         End If
  1969.                     
  1970.       Case Else
  1971.       End Select
  1972.       
  1973.       lngIndex = lngIndex + 1
  1974.       
  1975.     Else
  1976.       boolDone = True
  1977.       
  1978.     End If
  1979.   Loop
  1980.  
  1981. ExitRoutine:
  1982.   strValues = strValues & vbCr
  1983.   If Len(strValues) = 1 Then strValues = strValues & vbCr
  1984.     
  1985.   lngResult = RegCloseKey(lngHandle)
  1986.   EnumRegValue = HHRegValues
  1987.     
  1988.   ' Clear any previous arguments
  1989.   strTopKey = ""
  1990.   strSubKey = ""
  1991.   strValues = ""
  1992.   strTempFileName = ""
  1993.     
  1994.   Exit Function
  1995.  
  1996. EnumRegValueError:
  1997.   EnumRegValue = HHRegValues
  1998.   
  1999. End Function
  2000.  
  2001. Public Function GetKeyInfo(ByVal key_name As String, _
  2002.     ByVal indent As Integer) As Boolean
  2003.  
  2004. ' Used with HHInstalled method to verify whether or not
  2005. ' HTML Help is installed on the system.
  2006.  
  2007.   Dim subkeys As Collection
  2008.   Dim subkey_values As Collection
  2009.   Dim subkey_num As Integer
  2010.   Dim subkey_name As String
  2011.   Dim subkey_value As String
  2012.   Dim Length As Long
  2013.   Dim hKey As Long
  2014.   Dim txt As String
  2015.     
  2016.   GetKeyInfo = True
  2017.   
  2018.   Set subkeys = New Collection
  2019.   Set subkey_values = New Collection
  2020.     
  2021.   If RegOpenKeyEx(HKEY_LOCAL_MACHINE, _
  2022.       key_name, _
  2023.       0&, KEY_ALL_ACCESS, hKey) <> ERROR_SUCCESS _
  2024.       Then
  2025.     GetKeyInfo = False
  2026.     Exit Function
  2027.   End If
  2028.     
  2029.   subkey_num = 0
  2030.   Do
  2031.     Length = 256
  2032.     subkey_name = Space$(Length)
  2033.     
  2034.     If RegEnumKey(hKey, subkey_num, _
  2035.         subkey_name, Length) _
  2036.         <> ERROR_SUCCESS Then Exit Do
  2037.         
  2038.     subkey_num = subkey_num + 1
  2039.         
  2040.     subkey_name = Left$(subkey_name, InStr(subkey_name, Chr$(0)) - 1)
  2041.     subkeys.Add subkey_name
  2042.     
  2043.     Length = 256
  2044.     subkey_value = Space$(Length)
  2045.     If RegQueryValue(hKey, subkey_name, _
  2046.         subkey_value, Length) _
  2047.         <> ERROR_SUCCESS _
  2048.         Then
  2049.       subkey_values.Add "Error"
  2050.     Else
  2051.       subkey_value = Left$(subkey_value, Length - 1)
  2052.       subkey_values.Add subkey_value
  2053.       End If
  2054.   Loop
  2055.     
  2056.   If RegCloseKey(hKey) <> ERROR_SUCCESS Then
  2057.     GetKeyInfo = False
  2058.   End If
  2059.     
  2060.   For subkey_num = 1 To subkeys.Count
  2061.     txt = txt & subkeys(subkey_num) & _
  2062.         ": " & subkey_values(subkey_num) & _
  2063.         vbCrLf
  2064.   Next subkey_num
  2065.     
  2066. End Function
  2067.  
  2068. Private Function RegKeyID(ByVal strTopKeyOrFile As String) As Long
  2069.  
  2070. ' Translates the registry key constants
  2071.  
  2072.   Dim strDir As String
  2073.  
  2074.   RegKeyID = 0
  2075.   Select Case UCase$(strTopKeyOrFile)
  2076.   Case "HKCU"
  2077.     RegKeyID = HKEY_CURRENT_USER
  2078.   Case "HKLM"
  2079.     RegKeyID = HKEY_LOCAL_MACHINE
  2080.   Case "HKU"
  2081.     RegKeyID = HKEY_USERS
  2082.   Case "HKDD"
  2083.     RegKeyID = HKEY_DYN_DATA
  2084.   Case "HKCC"
  2085.     RegKeyID = HKEY_CURRENT_CONFIG
  2086.   Case "HKCR"
  2087.     RegKeyID = HKEY_CLASSES_ROOT
  2088.   Case Else
  2089.     On Error Resume Next
  2090.     strDir = Dir$(strTopKeyOrFile)
  2091.     If Err.Number = 0 And strDir <> "" Then RegKeyID = 1
  2092.   End Select
  2093.   Exit Function
  2094.   
  2095. End Function
  2096.  
  2097. Private Function GetLongPath_Legacy(ByVal strShortName As String, _
  2098.     strLongName As String, lngBufferLength As Long) As Long
  2099.  
  2100. ' Translates a short path name into its actual long path
  2101. ' name.  On Windows 98 and 2000 systems and later, uses
  2102. ' the GetLongPathName API call in kernel32.  This is used
  2103. ' on these systems as it renders a slightly faster
  2104. ' processing time. GetLongPath_Legacy is set up in the
  2105. ' following manner to make it compatible with the
  2106. ' GetLongPathName API call:
  2107. '
  2108. ' strShortName:
  2109. '     Pointer to a null-terminated path to be converted.
  2110. ' strLongName:
  2111. '     Pointer to the buffer to receive the long path.
  2112. ' lngBufferLength:
  2113. '     Specifies the size of the buffer, in characters.
  2114.  
  2115. ' If the function succeeds, the return value is the
  2116. ' length of the string copied to the strLongName
  2117. ' parameter, in characters. This length does not include
  2118. ' the terminating null character.
  2119. '
  2120. ' If strLongName is too small on Windows 98 and 2000
  2121. ' systems and later, the function returns the size of the
  2122. ' buffer required to hold the long path, in characters.
  2123. ' This is due to the use of the GetLongPathName API call
  2124. ' on those operating systems.
  2125. '
  2126. ' If the function fails, the return value is zero.
  2127.  
  2128.   On Error GoTo ErrHandler
  2129.   
  2130.   Dim strTempLongName As String
  2131.   Dim strTemp As String
  2132.   Dim strPathTemp As String
  2133.   Dim intLength As Integer
  2134.   Dim intPosition As Integer
  2135.   Dim intStart As Integer
  2136.   Dim lngHandle As Long
  2137.   Dim lpFindFileData As WIN32_FIND_DATA
  2138.   
  2139.   If GetWindowsVersion >= WINDOWS_98 Then
  2140.     ' For Windows 98 and later, and Windows 2000
  2141.     ' and later, use the following API call:
  2142.     GetLongPath_Legacy = GetLongPathName(strShortName, _
  2143.         strLongName, lngBufferLength)
  2144.     Exit Function
  2145.   End If
  2146.   
  2147.   GetLongPath_Legacy = 0
  2148.   
  2149.   ' If stored in the registry, in some cases it's
  2150.   ' enclosed in double-quotes, so we need to delete them
  2151.   If Left$(strShortName, 1) = SINGLE_QUOTE Then _
  2152.       strShortName = Right$(strShortName, Len(strShortName) - 1)
  2153.   If Right$(strShortName, 1) = SINGLE_QUOTE Then _
  2154.       strShortName = Left$(strShortName, Len(strShortName) - 1)
  2155.       
  2156.   ' Add \ to short name to prevent Instr from failing
  2157.   If Right$(strShortName, 1) <> "\" Then _
  2158.       strShortName = Left$(strShortName, Len(strShortName) & "\")
  2159.   
  2160.   ' Save the drive letter for later
  2161.   strLongName = Left(strShortName, 2)
  2162.   
  2163.   ' Strip the drive letter off the temporary string
  2164.   strPathTemp = Right(strShortName, Len(strShortName) - 3)
  2165.   
  2166.   ' Find the first backslash
  2167.   intPosition = InStr(strPathTemp, "\")
  2168.   
  2169.   Do While intPosition <> 0
  2170.     
  2171.     ' Get the individual component of the path name
  2172.     strTemp = Left(strPathTemp, intPosition - 1)
  2173.     
  2174.     ' Translate the short path component into its
  2175.     ' actual long path component as found by FindFirstFile
  2176.     lngHandle = FindFirstFile(strLongName & "\" & strTemp, lpFindFileData)
  2177.     
  2178.     If (lngHandle) = INVALID_HANDLE_VALUE Then
  2179.     
  2180.       ' The folder or file does not exist
  2181.       Exit Function
  2182.     
  2183.     End If
  2184.     
  2185.     ' Get rid of any null characters retrieved if
  2186.     ' from the registry
  2187.     strTempLongName = StripNulls(lpFindFileData.cFileName)
  2188.     
  2189.     ' Build the long path name, starting with the
  2190.     ' previously-saved drive letter
  2191.     strLongName = strLongName & "\" & strTempLongName
  2192.     
  2193.     ' Delete the short path component we just used
  2194.     strPathTemp = Right(strPathTemp, Len(strPathTemp) - (Len(strTemp) + 1))
  2195.     
  2196.     ' Find the next backslash
  2197.     intPosition = InStr(strPathTemp, "\")
  2198.     
  2199.   Loop
  2200.   
  2201.   ' Add the remainder, which is the name of the file
  2202.   strLongName = strLongName & "\" & strPathTemp
  2203.   
  2204.   GetLongPath_Legacy = Len(strLongName)
  2205.  
  2206.   Exit Function
  2207.   
  2208. ErrHandler:
  2209.   Select Case Err.Number
  2210.   Case 52
  2211.     strLongName = ""
  2212.     Exit Function
  2213.   Case Else
  2214.     Resume Next
  2215.   End Select
  2216.  
  2217. End Function
  2218.  
  2219. Private Function StripNulls(OriginalStr As String) As String
  2220.  
  2221. ' Strips any trailing nulls from path names retrieved
  2222. ' from the registry. This function is found in the
  2223. ' following Microsoft(r) knowledge base articles:
  2224. ' Q183009 "HOWTO: Enumerate Windows Using the WIN32 API"
  2225. ' Q185476 "HOWTO: Search Directories to Find or List Files"
  2226. ' Q190218 "HOWTO: Retrieve Settings From a Printer Driver"
  2227.  
  2228.   If (InStr(OriginalStr, Chr(0)) > 0) Then
  2229.     OriginalStr = Left(OriginalStr, _
  2230.         InStr(OriginalStr, Chr(0)) - 1)
  2231.   End If
  2232.   
  2233.   StripNulls = OriginalStr
  2234.   
  2235. End Function
  2236.  
  2237. Private Sub GetHHVersion()
  2238.  
  2239. ' Retrieves the version of HTML Help on the system
  2240.   
  2241.   Dim varHHRegValues As HH_REG_VALUES
  2242.   Dim lngResult As Boolean
  2243.   Dim sHHValues As String
  2244.   Dim strTempHHctrlPath As String
  2245.   Dim strHHctrlPath As String
  2246.   
  2247.   ' Get the path of the registered copy of hhctrl.ocx
  2248.   varHHRegValues = EnumRegValue("HKCR", "CLSID\{4662DAB0-D393-11D0-9A56-00C04FB68B66}\InprocServer32", sHHValues, "")
  2249.   
  2250.   ' If hhctrl.ocx isn't registered, go past the next block.
  2251.   If Len(varHHRegValues.pszFilePath) = 0 Then
  2252.     MessageBoxCritical "Hhctrl.ocx is not registered.  " & _
  2253.         "Please install HTML Help."
  2254.     
  2255.   Else
  2256.     strHHctrlPath = Right(varHHRegValues.pszFilePath, (Len(varHHRegValues.pszFilePath) - 1))
  2257.   
  2258.     Dim lpFindFileData As WIN32_FIND_DATA
  2259.     Dim lngHandle As Long
  2260.     
  2261.     strTempHHctrlPath = StripNulls(strHHctrlPath)
  2262.     
  2263.     ' Translate short path name if registered that way
  2264.     lngResult = GetLongPath_Legacy(strTempHHctrlPath, strHHctrlPath, 256)
  2265.         
  2266.     ' Verify the HTML Help control exists according
  2267.     ' to the registry data.
  2268.     lngHandle = FindFirstFile(strHHctrlPath, lpFindFileData)
  2269.         
  2270.     If (lngHandle) = INVALID_HANDLE_VALUE Then
  2271.       MessageBoxCritical "Hhctrl.ocx is not in its registered location.  " & _
  2272.           "Please reinstall HTML Help."
  2273.       Exit Sub
  2274.     
  2275.     End If
  2276.   
  2277.     mvarHHVersion = GetVersionInfo(strHHctrlPath)
  2278.   
  2279.   End If
  2280.  
  2281. End Sub
  2282.  
  2283. Private Sub GetIEVersion()
  2284.  
  2285. ' Retrieves the version of Internet Explorer on the system
  2286.  
  2287.   Dim varIERegValues As HH_REG_VALUES
  2288.   Dim sIEValues As String
  2289.   Dim strShdocvwPath As String
  2290.   Dim lngResult As Boolean
  2291.   Dim strIexploreTempPath As String
  2292.   Dim lngHandle As Long
  2293.   Dim lpFindFileData As WIN32_FIND_DATA
  2294.  
  2295.   ' Get the path of the registered copy of shdocvw.dll
  2296.   varIERegValues = EnumRegValue("HKCR", "CLSID\{0A89A860-D7B1-11CE-8350-444553540000}\InProcServer32", sIEValues, "")
  2297.   
  2298.   ' If shdocvw.dll isn't registered, go past the next block.
  2299.   If Len(varIERegValues.pszFilePath) = 0 Then
  2300.     MessageBoxCritical "Shdocvw.dll is not registered.  " & _
  2301.         "Please install Internet Explorer."
  2302.   Else
  2303.   
  2304.     strShdocvwPath = Right(varIERegValues.pszFilePath, (Len(varIERegValues.pszFilePath) - 1))
  2305.     
  2306.     ' Translate short path name if registered that way
  2307.     lngResult = GetLongPath_Legacy(StripNulls(strShdocvwPath), strShdocvwPath, 256)
  2308.     
  2309.     ' Verify shdocvw.dll exists according
  2310.     ' to the registry data.
  2311.     lngHandle = FindFirstFile(strShdocvwPath, lpFindFileData)
  2312.     
  2313.     If (lngHandle) = INVALID_HANDLE_VALUE Then
  2314.       MessageBoxCritical "Internet Explorer is not in its registered location.  " & _
  2315.           "Please reinstall Internet Explorer."
  2316.       Exit Sub
  2317.     
  2318.     End If
  2319.   
  2320.     mvarIEVersion = GetVersionInfo(strShdocvwPath)
  2321.     
  2322.   End If
  2323.   
  2324. End Sub
  2325.  
  2326. Private Function GetHHFriendlyName() As String
  2327.  
  2328. ' Retrieves the friendly name of HTML Help as installed
  2329.  
  2330.   If mvarHHVersion = "" Then
  2331.     GetHHVersion
  2332.   End If
  2333.   ' Take into account how this module
  2334.   ' returns version numbers
  2335.   Select Case mvarHHVersion
  2336.   Case "4.72.7290.00"
  2337.     mvarHHFriendlyName = "1.0"
  2338.   Case "4.72.7323.00"
  2339.     mvarHHFriendlyName = "1.1"
  2340.   Case "4.72.7325.00"
  2341.     mvarHHFriendlyName = "1.1a"
  2342.   Case "4.72.8164.00"
  2343.     mvarHHFriendlyName = "1.1b"
  2344.   Case "4.73.8252.00"
  2345.     mvarHHFriendlyName = "1.2"
  2346.   Case "4.73.8412.00"
  2347.     mvarHHFriendlyName = "1.21"
  2348.   Case "4.73.8474.00"
  2349.     mvarHHFriendlyName = "1.21a"
  2350.   Case "4.73.8561.00"
  2351.     mvarHHFriendlyName = "1.22"
  2352.   Case "4.74.8566.00"
  2353.     mvarHHFriendlyName = "1.3"
  2354.   Case Else
  2355.     mvarHHFriendlyName = "unknown"
  2356.   End Select
  2357.   
  2358. End Function
  2359.  
  2360. Private Function GetIEFriendlyName() As String
  2361.  
  2362. ' Retrieves the friendly name of Internet Explorer
  2363. ' as installed
  2364.   
  2365.   If mvarIEVersion = "" Then
  2366.     GetIEVersion
  2367.   End If
  2368.   
  2369.   ' Take into account how this module
  2370.   ' returns version numbers
  2371.   Select Case mvarIEVersion
  2372.   Case "4.70.1155.0000"
  2373.     mvarIEFriendlyName = "3.0"
  2374.   Case "4.70.1158.0000"
  2375.     mvarIEFriendlyName = "3.0 OSR2"
  2376.   Case "4.70.1215.0000"
  2377.     mvarIEFriendlyName = "3.02"
  2378.   Case "4.70.1300.0000"
  2379.     mvarIEFriendlyName = "3.02"
  2380.   Case "4.71.1008.3000"
  2381.     mvarIEFriendlyName = "4.0 PP2"
  2382.   Case "4.71.1712.5000"
  2383.     mvarIEFriendlyName = "4.0"
  2384.   Case "4.72.2106.7000"
  2385.     mvarIEFriendlyName = "4.01"
  2386.   Case "4.72.3110.0300"
  2387.     mvarIEFriendlyName = "4.0 SP1"
  2388.   Case "4.72.3612.1707"
  2389.     mvarIEFriendlyName = "4.0 SP2"
  2390.   Case "5.00.0518.5000"
  2391.     mvarIEFriendlyName = "5.0 beta 1"
  2392.   Case "5.00.0910.1308"
  2393.     mvarIEFriendlyName = "5.0 beta 2"
  2394.   Case "5.00.2014.2130"
  2395.     mvarIEFriendlyName = "5.0"
  2396.   Case "5.00.2314.1000"
  2397.     mvarIEFriendlyName = "5.0a (Office 2000)"
  2398.   Case "5.00.2614.3500"
  2399.     mvarIEFriendlyName = "5.0b (Windows 98 SE)"
  2400.   Case "5.00.2717.2000"
  2401.     mvarIEFriendlyName = "5.0c (Icon Security Issue Update)"
  2402.   Case Else
  2403.     mvarIEFriendlyName = "unknown"
  2404.   End Select
  2405.   
  2406. End Function
  2407.  
  2408. Public Function GetWindowsVersion() As Long
  2409.             
  2410.   Dim osinfo As OSVERSIONINFO
  2411.   Dim retvalue As Integer
  2412.  
  2413.   osinfo.dwOSVersionInfoSize = 148
  2414.   osinfo.szCSDVersion = Space$(128)
  2415.   retvalue = GetVersionExA(osinfo)
  2416.  
  2417.   With osinfo
  2418.     Select Case .dwPlatformId
  2419.     Case VER_PLATFORM_WIN32_WINDOWS
  2420.       If .dwMinorVersion = 0 Then
  2421.         GetWindowsVersion = WINDOWS_95
  2422.       ElseIf .dwMinorVersion = 10 Then
  2423.         GetWindowsVersion = WINDOWS_98
  2424.       End If
  2425.     Case VER_PLATFORM_WIN32_NT
  2426.       If .dwMajorVersion = 3 Then
  2427.         GetWindowsVersion = WINDOWS_NT_3_51
  2428.       ElseIf .dwMajorVersion = 4 Then
  2429.         GetWindowsVersion = WINDOWS_NT_4
  2430.       ElseIf .dwMajorVersion = 5 Then
  2431.         GetWindowsVersion = WINDOWS_2000
  2432.       End If
  2433.     Case Else
  2434.       GetWindowsVersion = UNKNOWN_OS
  2435.     End Select
  2436.   End With
  2437.  
  2438. End Function
  2439.  
  2440. Private Function MessageBoxCritical(ByVal strMessage As String) As Long
  2441.  
  2442. ' Displays a message box with a "critical" icon
  2443.  
  2444.   Dim mbpParams As MSGBOXPARAMS
  2445.  
  2446.   mbpParams.cbSize = Len(mbpParams)
  2447.   mbpParams.dwStyle = MB_OK Or MB_ICONSTOP
  2448.   mbpParams.lpszCaption = "HTML Help Class"
  2449.   mbpParams.lpszText = strMessage
  2450.     
  2451.   MessageBoxCritical = MessageBoxIndirect(mbpParams)
  2452.   
  2453. End Function
  2454.  
  2455. Private Function MessageBoxExclamation(ByVal strMessage As String) As Long
  2456.  
  2457. ' Displays a message box with an "exclamation" icon
  2458.  
  2459.   Dim mbpParams As MSGBOXPARAMS
  2460.  
  2461.   mbpParams.cbSize = Len(mbpParams)
  2462.   mbpParams.dwStyle = MB_OK Or MB_ICONSTOP
  2463.   mbpParams.lpszCaption = "HTML Help Class"
  2464.   mbpParams.lpszText = strMessage
  2465.     
  2466.   MessageBoxExclamation = MessageBoxIndirect(mbpParams)
  2467.   
  2468. End Function
  2469.  
  2470. Private Function MessageBoxInformation(ByVal strMessage As String) As Long
  2471.  
  2472. ' Displays a message box with an "information" icon
  2473.  
  2474.   Dim mbpParams As MSGBOXPARAMS
  2475.  
  2476.   mbpParams.cbSize = Len(mbpParams)
  2477.   mbpParams.dwStyle = MB_OK Or MB_ICONINFORMATION
  2478.   mbpParams.lpszCaption = "HTML Help Class"
  2479.   mbpParams.lpszText = strMessage
  2480.     
  2481.   MessageBoxInformation = MessageBoxIndirect(mbpParams)
  2482.   
  2483. End Function
  2484.  
  2485. Public Property Let HHWindow(ByVal vData As String)
  2486.  
  2487. ' Specifies the HTML Help window for use
  2488. ' with various methods.
  2489.  
  2490.   On Error Resume Next
  2491.     
  2492.   mvarHHWindow = vData
  2493.     
  2494. End Property
  2495.  
  2496. Public Property Get HHWindow() As String
  2497.  
  2498.   On Error Resume Next
  2499.     
  2500.   HHWindow = mvarHHWindow
  2501.     
  2502. End Property
  2503.  
  2504. Public Property Let HHTopicURL(ByVal vData As String)
  2505.  
  2506. ' Specifies the topic path and file name for the
  2507. ' HHDisplayTopicURL method
  2508.  
  2509.   mvarHHTopicURL = vData
  2510.     
  2511. End Property
  2512.  
  2513. Public Property Get HHTopicURL() As String
  2514.  
  2515.   On Error Resume Next
  2516.    
  2517.   HHTopicURL = mvarHHTopicURL
  2518.     
  2519. End Property
  2520.  
  2521. Public Property Let HHTopicID(ByVal vData As Long)
  2522.  
  2523. ' Specifies the context integer for the
  2524. ' HHDisplayTopicID method
  2525.  
  2526.   On Error Resume Next
  2527.     
  2528.   mvarHHTopicID = vData
  2529.     
  2530. End Property
  2531.  
  2532. Public Property Get HHTopicID() As Long
  2533.  
  2534.   On Error Resume Next
  2535.         
  2536.   HHTopicID = mvarHHTopicID
  2537.     
  2538. End Property
  2539.  
  2540. Public Property Let HHMsgTitle(ByVal vData As String)
  2541.  
  2542. ' Specifies the title to display on a message box if
  2543. ' a keyword cannot be found
  2544.  
  2545.   On Error Resume Next
  2546.     
  2547.   mvarHHMsgTitle = vData
  2548.     
  2549. End Property
  2550.  
  2551. Public Property Get HHMsgTitle() As String
  2552.  
  2553.   On Error Resume Next
  2554.     
  2555.   HHMsgTitle = mvarHHMsgTitle
  2556.     
  2557. End Property
  2558.  
  2559. Public Property Let HHMsgText(ByVal vData As String)
  2560.  
  2561. ' Specifies the text to display in a message box if
  2562. ' a keyword cannot be found
  2563.  
  2564.   On Error Resume Next
  2565.     
  2566.   mvarHHMsgText = vData
  2567.     
  2568. End Property
  2569.  
  2570. Public Property Get HHMsgText() As String
  2571.  
  2572.   On Error Resume Next
  2573.     
  2574.   HHMsgText = mvarHHMsgText
  2575.     
  2576. End Property
  2577.  
  2578. Public Property Let HHKeyword(ByVal vData As String)
  2579.  
  2580. ' Specifies a keyword to search for using HHDisplayKeyword
  2581.  
  2582.   On Error Resume Next
  2583.     
  2584.   mvarHHKeyword = vData
  2585.     
  2586. End Property
  2587.  
  2588. Public Property Get HHKeyword() As String
  2589.  
  2590.   On Error Resume Next
  2591.     
  2592.   HHKeyword = mvarHHKeyword
  2593.     
  2594. End Property
  2595.  
  2596. Public Property Let HHDefaultURL(ByVal vData As String)
  2597.  
  2598. ' Specifies the URL to use if a keyword cannot be found
  2599.  
  2600.   On Error Resume Next
  2601.     
  2602.   mvarHHDefaultURL = vData
  2603.     
  2604. End Property
  2605.  
  2606. Public Property Get HHDefaultURL() As String
  2607.  
  2608.   On Error Resume Next
  2609.     
  2610.   HHDefaultURL = mvarHHDefaultURL
  2611.     
  2612. End Property
  2613.  
  2614. Public Property Let HHALink(ByVal vData As String)
  2615.  
  2616. ' Specifies an ALink keyword to search for using
  2617. ' HHDisplayALink
  2618.  
  2619.   On Error Resume Next
  2620.     
  2621.   mvarHHALink = vData
  2622.     
  2623. End Property
  2624.  
  2625. Public Property Get HHALink() As String
  2626.  
  2627.   On Error Resume Next
  2628.     
  2629.   HHALink = mvarHHALink
  2630.     
  2631. End Property
  2632.  
  2633. Public Property Let CHMFile(ByVal vData As String)
  2634.  
  2635. ' Path and file name of the HTML Help file to display
  2636.  
  2637.   On Error Resume Next
  2638.     
  2639.   mvarCHMFile = vData
  2640.     
  2641. End Property
  2642.  
  2643. Public Property Get CHMFile() As String
  2644.  
  2645.   On Error Resume Next
  2646.     
  2647.   CHMFile = mvarCHMFile
  2648.     
  2649. End Property
  2650.  
  2651. Public Property Let HHShowOnTop(ByVal vData As Boolean)
  2652.  
  2653. ' If set to True, the HTML Help window will be set as
  2654. ' a sibling of the calling window
  2655.  
  2656.   On Error Resume Next
  2657.     
  2658.   mvarHHShowOnTop = vData
  2659.     
  2660. End Property
  2661.  
  2662. Public Property Get HHShowOnTop() As Boolean
  2663.  
  2664.   On Error Resume Next
  2665.     
  2666.   HHShowOnTop = mvarHHShowOnTop
  2667.     
  2668. End Property
  2669.  
  2670. Public Property Get HHRegFileName() As String
  2671.  
  2672. ' Used in conjunction with HHCheckRegistry,
  2673. ' returns the confirmed CHM file name
  2674.  
  2675.   On Error Resume Next
  2676.     
  2677.   HHRegFileName = mvarHHRegFileName
  2678.     
  2679. End Property
  2680.  
  2681. Public Property Get HHRegFilePath() As String
  2682.  
  2683. ' Used in conjunction with HHCheckRegistry,
  2684. ' returns the path of the confirmed CHM file name
  2685.  
  2686.   On Error Resume Next
  2687.     
  2688.   HHRegFilePath = mvarHHRegFilePath
  2689.     
  2690. End Property
  2691.  
  2692. Public Property Get HHRegFileExists() As Boolean
  2693.  
  2694. ' Used in conjunction with HHCheckRegistry, returns
  2695. ' True if the file exists at the registered path,
  2696. ' False if it doesn't
  2697.  
  2698.   On Error Resume Next
  2699.     
  2700.   HHRegFileExists = mvarHHRegFileExists
  2701.     
  2702. End Property
  2703.  
  2704. Public Property Let HHPopupFile(ByVal vData As String)
  2705.  
  2706. ' Specifies the text file containing the popup text as
  2707. ' listed in the [TEXT POPUPS] section of a CHM
  2708.  
  2709.   On Error Resume Next
  2710.     
  2711.   mvarHHPopupFile = vData
  2712.     
  2713. End Property
  2714.  
  2715. Public Property Let HHPopupID(ByVal vData As Long)
  2716.  
  2717. ' Specifies the resource containing the to retrieve
  2718. ' popup text from as listed in a Visual Basic project
  2719. ' or the context integer of a popup topic as specified
  2720. ' in a valid popup file in a CHM
  2721.  
  2722.   On Error Resume Next
  2723.     
  2724.   mvarHHPopupID = vData
  2725.     
  2726. End Property
  2727.  
  2728. Public Property Let HHPopupText(ByVal vData As String)
  2729.  
  2730. ' Specifies the text to display in a simple text popup
  2731.  
  2732.   On Error Resume Next
  2733.     
  2734.   mvarHHPopupText = vData
  2735.     
  2736. End Property
  2737.  
  2738. Public Property Let HHPopupType(ByVal vData As PopupType)
  2739.  
  2740. ' The type of popup to be generated by HHDisplayPopup
  2741.  
  2742.   On Error Resume Next
  2743.     
  2744.   mvarHHPopupType = vData
  2745.     
  2746. End Property
  2747.  
  2748. Public Property Let HHPopupTextColor(ByVal vData As ColorConstants)
  2749.  
  2750. ' Sets the text color for a popup generated with HHDisplayPopup using
  2751. ' the standard VB color constants
  2752.  
  2753.   On Error Resume Next
  2754.     
  2755.   mvarHHPopupTextColor = vData
  2756.     
  2757. End Property
  2758.  
  2759. Public Property Let HHPopupBackColor(ByVal vData As ColorConstants)
  2760.  
  2761. ' Sets the back color of a popup generated with HHDisplayPopup using
  2762. ' the standard VB color constants
  2763.  
  2764.   On Error Resume Next
  2765.     
  2766.   mvarHHPopupBackColor = vData
  2767.     
  2768. End Property
  2769.  
  2770. Public Property Let HHPopupCustomTextColor(ByVal vData As Long)
  2771.  
  2772. ' Sets the text color for a popup generated with
  2773. ' HHDisplayPopup using custom colors in the form &HBBGGRR.
  2774.  
  2775.   On Error Resume Next
  2776.     
  2777.   mvarHHPopupCustomTextColor = vData
  2778.     
  2779. End Property
  2780.  
  2781. Public Property Let HHPopupCustomBackColor(ByVal vData As Long)
  2782.  
  2783. ' Sets the back color of a popup generated with
  2784. ' HHDisplayPopup using custom colors in the form &HBBGGRR
  2785.  
  2786.   On Error Resume Next
  2787.     
  2788.   mvarHHPopupCustomBackColor = vData
  2789.     
  2790. End Property
  2791.  
  2792. Public Property Let HHPopupCustomColors(ByVal vData As Boolean)
  2793.  
  2794. ' True of the HHPopupCustomTextColor and HHPopupCustomBackColor
  2795. ' are going to be used, False if not
  2796.  
  2797.   On Error Resume Next
  2798.     
  2799.   mvarHHPopupCustomColors = vData
  2800.     
  2801. End Property
  2802.  
  2803. Public Property Get HHPopupCustomColors() As Boolean
  2804.  
  2805.   On Error Resume Next
  2806.         
  2807.   HHPopupCustomColors = mvarHHPopupCustomColors
  2808.     
  2809. End Property
  2810.  
  2811. Public Property Let HHPopupTextFont(ByVal vData As String)
  2812.  
  2813. ' Name of the font to be used in a text popup
  2814.  
  2815.   On Error Resume Next
  2816.     
  2817.   mvarHHPopupTextFont = vData
  2818.     
  2819. End Property
  2820.  
  2821. Public Property Let HHPopupTextSize(ByVal vData As String)
  2822.  
  2823. ' Point size of the font used in a text popup
  2824.  
  2825.   On Error Resume Next
  2826.     
  2827.   mvarHHPopupTextSize = vData
  2828.     
  2829. End Property
  2830.  
  2831. Public Property Let HHPopupTextBold(ByVal vData As Boolean)
  2832.  
  2833. ' Set to True to make the popup text bold, False otherwise
  2834.  
  2835.   On Error Resume Next
  2836.     
  2837.   mvarHHPopupTextBold = vData
  2838.     
  2839. End Property
  2840.  
  2841. Public Property Let HHPopupTextItalic(ByVal vData As Boolean)
  2842.  
  2843. ' Set to True to make the popup text italicized, False otherwise
  2844.  
  2845.   On Error Resume Next
  2846.     
  2847.   mvarHHPopupTextItalic = vData
  2848.     
  2849. End Property
  2850.  
  2851. Public Property Let HHPopupTextUnderline(ByVal vData As Boolean)
  2852.  
  2853. ' Set to True to make the popup text underlined, False otherwise
  2854.  
  2855.   On Error Resume Next
  2856.     
  2857.   mvarHHPopupTextUnderline = vData
  2858.     
  2859. End Property
  2860.  
  2861. Public Property Get HHInstalled() As Boolean
  2862.    
  2863. ' Verifies whether or not HTML Help is installed on
  2864. ' the system.  This is done by checking the existence of
  2865. ' HKEY_LOCAL_MACHINE\Software\CLASSES\TypeLib\{ADB880A2-D8FF-11CF-9377-00AA003B7A11}
  2866.    
  2867.   mvarHHInstalled = GetKeyInfo("SOFTWARE\Classes\TypeLib\{ADB880A2-D8FF-11CF-9377-00AA003B7A11}", 0)
  2868.    
  2869.   HHInstalled = mvarHHInstalled
  2870.     
  2871. End Property
  2872.  
  2873. Public Property Get HHVersion() As String
  2874.  
  2875. ' Returns the current version of HTML Help on the
  2876. ' system as a String expression
  2877.  
  2878.   On Error Resume Next
  2879.     
  2880.   GetHHVersion
  2881.         
  2882.   HHVersion = mvarHHVersion
  2883.     
  2884. End Property
  2885.  
  2886. Public Property Get IEVersion() As String
  2887.  
  2888. ' Returns the current version of Internet Explorer on
  2889. ' the system as a String expression
  2890.  
  2891.   On Error Resume Next
  2892.     
  2893.   GetIEVersion
  2894.         
  2895.   IEVersion = mvarIEVersion
  2896.     
  2897. End Property
  2898.  
  2899. Public Property Get HHFriendlyName() As String
  2900.  
  2901. ' Returns the friendly name of the HTML Help version
  2902. ' as a String expression (i.e, "1.21a")
  2903.  
  2904.   On Error Resume Next
  2905.     
  2906.   GetHHFriendlyName
  2907.         
  2908.   HHFriendlyName = mvarHHFriendlyName
  2909.     
  2910. End Property
  2911.  
  2912. Public Property Get IEFriendlyName() As String
  2913.  
  2914. ' Returns the friendly name of the Internet Explorer
  2915. ' version as a String expression (i.e, "5.0")
  2916.  
  2917.   On Error Resume Next
  2918.     
  2919.   GetIEFriendlyName
  2920.         
  2921.   IEFriendlyName = mvarIEFriendlyName
  2922.     
  2923. End Property
  2924.